按下返回按钮时在 UITextField 之间切换

Posted

技术标签:

【中文标题】按下返回按钮时在 UITextField 之间切换【英文标题】:Switch between UITextFields when return button is pressed 【发布时间】: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 都有自己的堆栈视图. 【参考方案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 尝试编辑答案。这可能是实现您想要的正确方法。

以上是关于按下返回按钮时在 UITextField 之间切换的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中按下返回键时在文本字段之间切换

按下按钮和文本字段切换后 UITextField 失去焦点(键盘保持可见)

如何在回调时在 Kivy 布局之间切换?

按下按钮时在 UITableViewCell 中查找按钮的 indexPath?

如何在按钮单击时在“ui-body-a”和“ui-body-b”之间切换[重复]

如何在移动屏幕上按下按钮时发生动画?