了解第一响应者的系统逻辑

时间:2011-09-07 15:02:53

标签: objective-c ios cocoa-touch first-responder uiresponder

我对几个第一响应者点感到困惑:

  1. 如果我致电- becomeFirstResponder,系统是否先调用– canBecomeFirstResponder?为什么?
  2. 为什么- becomeFirstResponder– canBecomeFirstResponder都有?在什么情况下他们可以返回不同的值?
  3. 申请是否必须每次都有第一响应者?如果是这样,当我在某个对象上调用– resignFirstResponder时会发生什么? UIApplication是立即成为第一响应者还是在响应者链中的某个点上抛出这个“令牌”?当我想要摆脱那个朝圣者代币时,我可以在- becomeFirstResponder对象上调用UIApplication吗?
  4. ...
  5. 请有人解释一下,系统如何管理其第一响应者。当一些物体成为第一响应者时,在什么时候发生了什么,当第一响应者辞职时会发生什么。系统做什么电话......谢谢!

1 个答案:

答案 0 :(得分:6)

  1. becomeFirstResponder的默认实现会调用canBecomeFirstResponder。这是因为从canBecomeFirstResponder返回NO的响应者不应该成为第一个响应者。
  2. 如果成功,
  3. becomeFirstResponder将使接收者真正成为第一个响应者。 canBecomeFirstResponder只是检查接收者是否愿意成为第一个响应者,而不实际改变任何东西。如果当前的第一响应者拒绝辞职,becomeFirstResponder可能会失败。可能还有其他情况becomeFirstResponder也可能失败。
  4. 您的代码中没有任何具有第一响应者状态的内容。通过私有UIResponder方法firstResponder来判断,在这种情况下,系统不会指定任何特定的默认值。
  5. 基本上,当某些事物想要成为第一响应者时,要求当前第一响应者(如果有的话)辞职,然后新对象成为第一响应者。这可能导致系统显示屏幕键盘或采取其他一些操作。当第一个响应者辞职时,这可能同样会导致系统隐藏屏幕键盘或采取其他行动。

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

    有关详细信息,请参阅the documentation