UIMenuController和响应者链:发生了什么?

时间:2011-10-04 00:36:19

标签: iphone ios uiview first-responder uimenucontroller

我在自定义UIView子类上使用UIMenuController。这意味着它可以成为第一响应者,并在“删除”操作上声明canPerformAction

我也希望这个视图的superview(也是一个自定义UIView)能够使用菜单控制器,所以在那个superview上,我已经将它标记为能够成为第一响应者,并实现了canPerformAction for不同的行为(在这种情况下“复制”和“切割”)。

这就是事情 - 当我从(第一个)子视图中看到菜单时,它将所有三个动作放在菜单中:删除,复制和剪切。在调试器中,我看到在菜单出现之前在两个视图上都调用了canBecomeFirstRespondercanPerformAction

这里发生了什么?为什么菜单控制器不能限制为成为第一响应者的视图?或者我没有正确诊断出来?

感谢。

1 个答案:

答案 0 :(得分:1)

您使用的代码是什么?

canPerformAction:withSender:的文档中,

  

如果响应者类实现了请求的操作,则此方法的此默认实现返回YES,如果不执行,则调用下一个响应者。 ...请注意,如果您的类为命令返回NO,则响应者链上的另一个响应者可能仍然返回YES,从而启用该命令。

似乎是矛盾的,说默认实现会递响响应者链,但是如果你返回NO,那么UIMenuController还会递送响应者链。

最简单的软糖可能会覆盖-nextResponder以返回nil,但这可能会产生其他副作用(对于一个,具有“nil”目标的操作默认会响应响应者链!)。