2011-09-07 60 views
8

我感到困惑severals第一响应点:了解系统逻辑急救员

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

请别人给我解释一下,系统如何管理它的第一个响应者。当某个对象成为第一响应者时,发生在什么情况下,当什么时候第一响应者辞职。系统会做什么?谢谢!

回答

6
  1. becomeFirstResponder的默认实现确实调用canBecomeFirstResponder。这是因为从canBecomeFirstResponder返回NO的响应者不应该成为第一响应者。
  2. becomeFirstResponder如果成功,会使接收器成为第一响应者。 canBecomeFirstResponder只是检查接收者是否愿意成为第一响应者,而没有实际改变任何东西。如果当前第一响应者拒绝辞职,那么becomeFirstResponder可能会失败。在其他情况下,becomeFirstResponder也可能会失败。
  3. 代码中没有任何第一响应者状态。通过专用UIResponder方法firstResponder来判断,在这种情况下,系统不会分配任何特定的默认值。

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

当一个非触摸事件进来时,它首先被传递到UIWindow。 UIWindow将它传递给第一响应者。该文档似乎并没有说明UIWindow是否尝试处理事件本身(并且如果它不处理它本身,就像平常一样传递给UIApplication),或者如果没有第一响应者就忽略该事件。详细请参照the documentation