我在自定义UIView子类上使用UIMenuController。这意味着它可以成为第一响应者,并在“删除”操作上声明canPerformAction
。
我也希望这个视图的superview(也是一个自定义UIView)能够使用菜单控制器,所以在那个superview上,我已经将它标记为能够成为第一响应者,并实现了canPerformAction
for不同的行为(在这种情况下“复制”和“切割”)。
这就是事情 - 当我从(第一个)子视图中看到菜单时,它将所有三个动作放在菜单中:删除,复制和剪切。在调试器中,我看到在菜单出现之前在两个视图上都调用了canBecomeFirstResponder
和canPerformAction
。
这里发生了什么?为什么菜单控制器不能限制为成为第一响应者的视图?或者我没有正确诊断出来?
感谢。
答案 0 :(得分:1)
您使用的代码是什么?
在canPerformAction:withSender:的文档中,
如果响应者类实现了请求的操作,则此方法的此默认实现返回YES,如果不执行,则调用下一个响应者。 ...请注意,如果您的类为命令返回NO,则响应者链上的另一个响应者可能仍然返回YES,从而启用该命令。
似乎是矛盾的,说默认实现会递响响应者链,但是如果你返回NO,那么UIMenuController还会递送响应者链。
最简单的软糖可能会覆盖-nextResponder
以返回nil,但这可能会产生其他副作用(对于一个,具有“nil”目标的操作默认会响应响应者链!)。