我需要从UIWebView的编辑菜单中禁用“定义”菜单项。应该通过实现canPerformAction:withSender:并为要禁用的项目返回NO来完成此操作。即使这些是 private 物品,似乎我也应该能够对我要保留的物品返回YES,对其他所有物品都返回NO(如this question)。

但是,这不起作用。 documentation

如果响应者链中没有响应者返回“是”,则将禁用菜单命令。请注意,如果您的类为命令返回了“否”,则响应者链中更远的另一个响应者可能仍会返回“是”,从而启用该命令。

看来这一定是无法正常工作的原因。如何找到哪个响应者返回“是”?

最佳答案

最后,我使用此功能解决了这个问题,该功能递归地遍历子视图并记录它们是否是第一响应者。

- (void) logResponderInfo: (UIView *)view
{
    NSLog(@"%@ %@", NSStringFromClass(view.class), view.isFirstResponder ? @"yes" : @"no");

    for (UIView *sub in view.subviews) {
        [self logResponderInfo:sub];
    }
}

我从canPerformAction:withSender:函数调用的
[self logResponderInfo:self.webView];

这写到日志
2013-11-18 11:35:56.100 Testing[44593:a0b] CDVCordovaView no
2013-11-18 11:35:56.100 Testing[44593:a0b] _UIWebViewScrollView no
2013-11-18 11:35:56.101 Testing[44593:a0b] UIWebBrowserView yes
2013-11-18 11:35:56.101 Testing[44593:a0b] UITextSelectionView no
2013-11-18 11:35:56.102 Testing[44593:a0b] UIView no
2013-11-18 11:35:56.102 Testing[44593:a0b] UIImageView no
2013-11-18 11:35:56.103 Testing[44593:a0b] UIImageView no
2013-11-18 11:35:56.103 Testing[44593:a0b] UIActivityIndicatorView no
2013-11-18 11:35:56.104 Testing[44593:a0b] UIImageView no

告诉我,第一个响应者实际上是UIWebBrowserView。

10-04 13:35