按Return键触发UITextField展开segue:为什么/如何工作?

时间:2017-11-14 15:41:22

标签: ios11

在我当前的项目中,我发现我可以向UITextField添加一个展开segue,如果我还添加了一个动作来处理didEndOnExit事件,则按返回键来触发segue。如果didEndOnExit处理程序未连接到事件,则不会触发segue。

我想了解这种行为。我的兴趣源于我可能需要了解segue如何运作。另一方面,行为可能只是UITextFields的唯一行为。

This简单的GitHub项目演示了这种行为。

感谢您的关注。

1 个答案:

答案 0 :(得分:2)

你做了一件非常不寻常的事情:你已经将一个触发的segue附加到文本字段,因为它的动作是segue。所以问题很简单:这是什么意思?特别是什么触发了附加到文本字段的触发segue?文本字段的“动作”是什么?

我的意思是,我们知道是什么触发了连接到按钮的触发segue:用户点击按钮。我们知道是什么触发了附加到表格视图单元格的触发segue:用户选择单元格。但是文本字段呢?用户必须做些什么来触发其行动?

“放松”业务是一个红色的鲱鱼,所以让我们从我们的想法中消除它。从第二个视图控制器中删除文本字段,并将其放在第一个视图控制器中。将文本字段的动作segue作为模式segue挂钩到第二个视图控制器。

现在考虑第一个视图控制器中的文本字段。它的行为与你所描述的一样:

  • 如果我们点击文字字段并输入并点击返回,则不会发生任何事情。

  • 如果我们将Do End On Exit添加到文本字段并输入并点击返回,键盘将被解除,我们就会离开。

好吧,想想第一个要点中的那句话“没有任何反应”。键盘没有被解雇!但解雇键盘文本字段的“动作”。没有采取行动。所以没有触发动作segue。

现在尝试这个实验:使视图控制器成为文本字段的委托,并实现此方法:

extension ViewController : UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

输入文本字段并单击Return。键盘被解除,我们将转换为下一个视图控制器。取消键盘以响应返回键 文本字段的操作。

所以你看,在某种意义上,unwind segue和DidEndOnExit都是红色的鲱鱼,因为我刚刚完成了同样的事情而没有其中任何一个。什么是文本字段的行动是什么,以及它的行动瞄准的响应触发。