UIMenuController 和响应者链:发生了啥?

Posted

技术标签:

【中文标题】UIMenuController 和响应者链:发生了啥?【英文标题】:UIMenuController and the responder chain: what's going on?UIMenuController 和响应者链:发生了什么? 【发布时间】:2011-10-04 00:36:19 【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

【参考方案1】:

你用的是什么代码?

在canPerformAction:withSender: 的文档中,

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

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

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

【讨论】:

嗯,这就解释了。谢谢。我没有意识到响应者链是以这种方式使用的。看起来很容易将canPerformAction:withSender 逻辑包装在基于该子视图是否处于活动状态的条件中。很奇怪,但不会太痛苦。感谢您的指点!

以上是关于UIMenuController 和响应者链:发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章

摆脱 UIMenuController 中的标准项目

在 UIView 上设置 UIMenuController

UIMenuController

UITableViewCell 不会成为第一响应者(在单元格手势上显示 UIMenuController)

UIMenuController 响应很慢

UIMenuController 没有响应第一个选择,只有第二个