键盘解雇的 resignFirstResponder 与 endEditing

Posted

技术标签:

【中文标题】键盘解雇的 resignFirstResponder 与 endEditing【英文标题】:resignFirstResponder vs. endEditing for Keyboard Dismissal 【发布时间】:2015-04-26 19:56:53 【问题描述】:

在 Swift 中,[someTextField].resignFirstResponder()self.view.endEditing(true) 都完成了相同的任务 - 将键盘隐藏在用户的视野之外,并使正在使用它的任何文本字段失去焦点。我知道前者特定于特定字段,而后者涵盖整个视图,但除了想要定位特定文本字段之外,什么时候首选/推荐一个?

【问题讨论】:

我对使用其中一种或另一种的具体情况一无所知。我想说,如果你有对文本字段的引用,你应该使用resignFirstResponder;否则在视图上调用endEditing 是完全可以的。随时纠正我:) 这是一个非常有趣的问题。我看不出有任何理由使用resignFirstResponder. 我相信他们将来会弃用resignFirstResponder.。 (关于效率方面,你说的是几个项目,这无关紧要......如果出于某种原因你碰巧想要,你可以就那个项目打电话endEditing。) 【参考方案1】:

someTextField.resignFirstResponder()

resignFirstResponder() 非常适合在您确切知道哪个文本字段是第一响应者并且您想放弃其第一响应者状态时使用。这可能比替代方法更有效,但如果您正在执行诸如创建自定义控件之类的操作,这可能很有意义。例如,您可能有一个文本字段,当按下“下一步”按钮时,您想摆脱键盘并呈现一个日期选择器。在这里,我肯定会使用resignFirstResponder()

self.view.endEditing(true)

我通常将此保留在我绝对需要清除键盘的情况下,无论当前发生什么,无论出于何种原因。也许,我有一个滑动菜单?就在这滑出之前,无论发生什么,键盘都应该消失,所以我会确保 everything 放弃其第一响应者状态。重要的是要注意endEditing() 将查看子视图的整个层次结构,并确保第一响应者放弃其状态。如果您已经有对第一响应者的具体引用,这会降低调用 resignFirstResponder() 的效率,但如果没有,则比找到该视图并让它辞职更容易。

【讨论】:

啊,这就是我想知道的,是否存在任何不明显的潜在差异。感谢您的帮助! 实际上,作为您回答的后续行动......在可能不知道第一响应者的情况下,是否有一个函数可以找出当前具有焦点的对象,然后提供对象的名称为resignFirstResponder()?如果可能的话,它似乎比第二种方法更有效。 如果你不知道对象,调用endEditing 会比试图找出哪个对象是第一个响应者来调用resignFirstResponder 更有效。 @nhgrif 我们可以将resignFirstResponder() 用于 UIView。这是什么意思? 如果我有多个文本字段,例如:名字、姓氏、地址等,最后我有一个 submit 按钮,那么self.view.endEditing 会是一个更好的选择【参考方案2】:

没有这么严格的规定。

当您拥有当前持有第一响应者状态的文本字段的引用时,您使用resignFirstResponder。当您没有参考资料或对此不确定时,endEditing 可以解决问题。

但需要注意的是,endEditing 有一个布尔参数,我们偶尔会将其设置为true。通过将此参数设置为true,已调用endEditing 的视图将强制每个子文本字段退出第一响应者状态,而不管它是否从textFieldShouldEndEditing 委托方法返回了false 值。相反,用false 调用endEditing 只会要求(而不是强制)文本字段辞职,尊重textFieldShouldEndEditing 协议方法的返回值。

【讨论】:

知道了,这是我不知道的一种方法...我猜这将用于文本验证或其他错误处理?

以上是关于键盘解雇的 resignFirstResponder 与 endEditing的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 键盘、完成按钮和 resignFirstResponder

iPhone:为啥发送消息 resignFirstResponder 会删除键盘?

resignFirstResponder 不关闭 UITextField 的 ASCII 键盘

键盘不会随着 resignFirstResponder 消失

resignFirstResponder 无法关闭我在 iPad 上的自定义键盘。为啥?

即使运行代码,resignFirstResponder 也不会关闭键盘