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

use*_*500 8 cocoa-touch objective-c first-responder uiresponder ios

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

  1. 如果我打电话- becomeFirstResponder,系统是否– canBecomeFirstResponder先打电话?为什么?
  2. 为什么有两个- becomeFirstResponder– canBecomeFirstResponder?在什么情况下他们可以返回不同的值?
  3. 申请是否必须每次都有第一响应者?如果是这样,当我打电话– resignFirstResponder给某个对象时会发生什么?是否UIApplication立即成为第一个响应者,或者这是"令牌"扔在响应链的某一点?我能叫- becomeFirstResponderUIApplication对象时,我想摆脱那朝圣者令牌?
  4. ...

请有人解释我,系统如何管理其第一响应者.当某个对象成为第一响应者时,在什么时候发生了什么,当第一个响应者辞职时会发生什么.系统做什么电话......谢谢!

Ano*_*mie 6

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

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

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

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