【问题标题】:Switch between UITextFields when return button is pressed按下返回按钮时在 UITextField 之间切换
【发布时间】:2018-11-11 19:44:39
【问题描述】:

我试图让我的 UITextFields 在按下返回按钮时切换到下一个。这是我的代码:

func textFieldShouldReturn(_ textField: UITextField) -> Bool
    {
        // Try to find next responder
        if let nextField = textField.superview?.superview?.viewWithTag(textField.tag + 1) as? UITextField {
            nextField.becomeFirstResponder()
            print("success")
        } else { //if textField.text != nil {
            textField.resignFirstResponder()
            print("error")
    } 
    return false
}

我一直将此代码用于其他项目。但是,这是一个例外。我在它自己的堆栈视图中拥有每个元素,并且所有这些堆栈视图都在超级视图堆栈视图中。运行应用程序后,我按下返回按钮,然后它转到 else 语句并辞去第一响应者的职务。我需要它来运行nextField.becomesFirstResponder() Here is a screenshot

【问题讨论】:

  • 有什么问题??
  • 你不是忘记设置每个文本字段的代表了吗?
  • 我设置了代表和文本字段的标签。看截图。
  • 从不假设 UI 组件的私有子视图结构。
  • 我认为问题是,if let 语句在 superview 中找不到其他 textField,因为 superview 是由其他堆栈视图组成的堆栈视图,每个 textField 都有自己的堆栈视图.

标签: ios swift uitextfield uistackview


【解决方案1】:

解决私人问题

if let nextField = self.view.viewWithTag(textField.tag + 1) as? UITextField 

但问题在于性能viewWithTag 在子视图中递归搜索

【讨论】:

  • 谢谢。但是你说的性能问题是什么意思?
【解决方案2】:

创建 Outlet Collection 并将每个文本字段连接到它

@IBOutlet var textFields: [UITextField]!

在文本字段委托函数之后使用这个:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let nextIndex = textField.tag + 1
    if textFields.count > nextIndex {
        let nextField = textFields[nextIndex]
        nextField.becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
    }
    return false
} 

【讨论】:

  • 虽然这可能会使代码工作,但这是一个糟糕的解决方案。永远不要对 UI 组件的私有子视图结构做任何假设。此代码可能会在以后的任何 iOS 更新中停止工作。
  • 此代码确实有效。但是,rmaddy 所说的私有子视图结构是我仍然需要帮助解决的。/
  • @Etiekyed 尝试编辑答案。这可能是实现您想要的正确方法。
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多