如何获取已请求成为第一响应者的 UIView?
Posted
技术标签:
【中文标题】如何获取已请求成为第一响应者的 UIView?【英文标题】:How to get the UIView that has requested to become the first responder? 【发布时间】:2017-10-17 03:29:42 【问题描述】:在我的应用程序中,我有很多 UITextFields 和 UITextViews 供用户输入数据。当用户点击某个字段时,它会成为第一响应者,并且键盘会很好地显示出来。当用户然后点击不同的字段(在修改当前字段之后)时,键盘消失并且当前字段不再是第一响应者。但是,被点击的字段不会立即成为新的第一响应者并且键盘会关闭。
在我的应用程序中,修改字段后,它会重新计算所有数据并重置所有其他字段中的值。我在想这就是导致新挖掘的字段失去它的第一响应者请求的原因。有些字段不受重新计算的影响,并且它们的行为正确(即它们立即获得焦点并且键盘保持打开状态)。所以我很确定更改字段的值或某些属性正在重置挂起的第一响应者请求。
如何检测该字段是否在第一响应者队列中待处理(如果有这样的事情)?
如何在不将其从该队列中删除的情况下进行更改?
【问题讨论】:
没有“第一响应者队列”。通常,如果用户点击一个字段,如果键盘已经显示,它不会消失。所以你一定让它消失了。你需要思考为什么会这样。 是的...其次,您在这里遇到的问题到底是什么?或者你想要完成什么? 当我点击另一个 UITextField 时,当前字段的 resignFirstResponder() 由 ios 调用,而不是我的代码(据我所知)。我正在从 textFieldDidEndEditing() 方法更新其他字段。所以我没有关闭键盘(至少不是直接关闭)。 我的目标是让用户将焦点从一个字段更改为下一个字段,并且值都在两者之间更新。目前,当他们点击下一个字段时,所有字段都会失去焦点,会发生更新,您必须再次点击下一个字段才能修改它。 UIResponder 的文档似乎暗示了一个带有 .next 属性的队列,描述为:Returns the next responder in the responder chain, or nil if there is no next responder.
但我看不出如何使用它或将其与实际字段相关联。
【参考方案1】:
好的,我发现了问题。我的代码将 .isEnabled 设置为 false,然后将其重置为 true。这就是导致该字段从第一响应者链中删除的原因。我的代码共享相同的查看和编辑路径,它最初将一个字段设置为禁用,如果我们处于编辑模式,则将其设置为启用。将其修复为仅将其设置为启用,没有初始的全面禁用,解决了问题。
所以底线是轻弹 .isEnabled 开关将从响应者链中删除该字段。
【讨论】:
以上是关于如何获取已请求成为第一响应者的 UIView?的主要内容,如果未能解决你的问题,请参考以下文章
当父 UIViewController 设置为 RootViewController 时,UIView 不会成为第一响应者