0

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

我还希望该视图的超级视图(也是自定义 UIView)能够使用菜单控制器,因此在该超级视图上,我已将其标记为能够成为第一响应者,并canPerformAction针对不同的操作(“复制”和“切”在这种情况下)。

事情是这样的——当我使菜单从(第一个)子视图中可见时,它会将所有三个操作都放在菜单中:删除、复制和剪切。在调试器中,我在菜单出现之前看到canBecomeFirstRespondercanPerformAction在两个视图上被调用。

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

谢谢。

4

1 回答 1

1

你用的是什么代码?

canPerformAction:withSender:的文档中,

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

这似乎是矛盾的,说默认实现递归响应者链,但如果你返回 NO,UIMenuController 也会递归响应者链。

最简单的软糖可能是重写-nextResponder以返回 nil,但这可能会产生其他副作用(例如,默认情况下,具有“nil”目标的操作会沿响应者链向上!)。

于 2011-10-04T04:01:01.610 回答