8

我对几个急救人员的观点感到困惑:

  1. 如果我打电话- becomeFirstResponder,系统会– canBecomeFirstResponder先调用吗?为什么?
  2. 为什么两者都有- becomeFirstResponder– canBecomeFirstResponder?在什么情况下它们可以返回不同的值?
  3. 应用程序每次都必须有第一响应者吗?如果是这样,当我调用– resignFirstResponder某个对象时会发生什么?UIApplication是立即成为第一响应者,还是在响应者链中的某个点上抛出这个“令牌” ?当我想摆脱那个朝圣者令牌时,我可以调用对象- becomeFirstResponder吗?UIApplication
  4. ...

请有人解释一下,系统如何管理其第一响应者。当某个对象成为第一响应者时,幕后发生了什么,当第一响应者辞职时会发生什么。系统调用什么...谢谢!

4

1 回答 1

6
  1. becomeFirstResponder确实调用的默认实现canBecomeFirstResponder。这是因为返回 NO 的响应者canBecomeFirstResponder不应该成为第一响应者。
  2. becomeFirstResponder如果成功,将使接收者实际上成为第一个响应者。canBecomeFirstResponder只是检查接收者是否愿意成为第一响应者,而无需实际更改任何内容。becomeFirstResponder如果当前的第一响应者拒绝辞职,则可能会失败。可能还有其他becomeFirstResponder可能失败的情况。
  3. 您的代码中不必有任何具有第一响应者状态的内容。从私有 UIResponder 方法来看,firstResponder在这种情况下系统没有分配任何特定的默认值。

基本上,当某事想要成为第一响应者时,当前的第一响应者(如果有的话)被要求辞职,然后新对象成为第一响应者。这可能会导致系统显示屏幕键盘或采取一些其他操作。当第一响应者辞职时,这同样可能导致系统隐藏屏幕键盘或采取其他一些措施。

当一个非触摸事件进来时,它首先被传递到 UIWindow。UIWindow 将其传递给第一响应者。该文档似乎没有指定 UIWindow 是否尝试处理事件本身(如果它自己不处理它,则像往常一样将其传递给 UIApplication )或者如果没有第一响应者则忽略该事件。

有关详细信息,请参阅文档

于 2011-09-07T15:41:17.263 回答