如何在 UIMenuController 中删除 COPY UIMenuItem

Posted

技术标签:

【中文标题】如何在 UIMenuController 中删除 COPY UIMenuItem【英文标题】:How to remove th COPY UIMenuItem in UIMenuController 【发布时间】:2010-07-16 06:48:29 【问题描述】:

我正在开发一个 iPhone 应用程序并使用 UIWebViews。我计划自定义在 UiWebView 中突出显示字符串时弹出的 UIMenuItems(复制、全选、剪切等)。我尝试删除这些菜单项,但无法删除 COPY 菜单项。

我需要你们的帮助。

谢谢, ZaldzBugz

【问题讨论】:

我相信这可以在canPerformAction中完成。但我真的不知道如何删除 COPY 菜单项。 嗨,你能告诉我如何删除 UIMenuController 中的其他菜单项吗?我想删除箭头项 @Risma - 你在尝试移除箭头项并将所有可用菜单放在主框架本身中是否有运气? 【参考方案1】:

您将不得不进行一些劫持。我什至不知道这是否可能。看起来它可能响应了一个名为 UILongPressGestureRecognizer 的手势事件。

您需要找出在哪个视图中添加了手势。像这样的。

NSArray *gestures = myWebView.gestureRecognizers;
for(int i=0;i<[gestures count];i++)
    UIGestureRecognizer g = [gestures objectAtIndex:i];
    if([g isKindOfClass:UILongPressGestureRecognizer.Class])
       [myWebView removeGestureRecognizer:g];
       break;
    

但我不认为手势直接在 UIWebview 上。它位于其子视图之一上。

所以它可能在这个子视图上

UIScrollView *sview = [[mywebview subviews] objectAtIndex:0];

如果不是在那个视图上,那么它可能在最上面的视图上,这是我怀疑的。它是一种未记录的 View 类型,但如果您将其视为我们正在调用的方法的 UIView,它可能是安全的。另外,由于您将其视为 UIView,因此据我了解,这并不违反规则。

UIScrollView *sview = [[mywebview subviews] objectAtIndex:0];
UIView *realWebView = [[sview subviews] objectAtIndex:10];

我没有编写 sn-p(未经测试)来尝试从所有视图中删除手势的原因是因为知道从哪个视图中删除它很重要。

删除后,您需要编写自己的 UILongPressGestureRecognizer,然后将新的添加到相应的视图(删除它的视图)。

您已经失去了复制选择等所有功能...但现在您可以实现自己的功能了。

如果您想要一些旧功能,我想我知道您可以如何取回它,但是我不能保证这是允许的或安全的。

在移除手势之前,您需要覆盖 UIView 的方法。您应该可以在您当前的工作类文件中(在文件顶部)执行此操作

@implementation UIView (extended)
     -(BOOL) respondsToSelector:(SEL)aSelector 
          printf("SELECTOR: %s\n", 
            [NSStringFromSelector(aSelector) UTF8String]);

          return [super respondsToSelector:aSelector];
     
@end

我不能保证任何事情,但这应该记录您视图中调用的每个方法的名称。

运行您的应用并执行复制、粘贴、选择、选择所有方法。您的日志应该显示当您按下按钮时调用了哪些方法。当您按下按钮时,它可能会显示几种方法,您可能只需要第一种。

现在,当您创建 menuItem 时,您就知道要分配给它的选择器了。

这只是猜测。希望对您有所帮助。

【讨论】:

【参考方案2】:

我使用this answer 中的技术解决了一个类似的问题,它可以消除复制菜单项。也就是说,在他们的示例中覆盖 UIWebView 而不是 UITextView 。还写了一个 canPerformAction:withSender: 在视图控制器中,它为我的自定义选择器返回 YES,为 copy: 选择器返回 NO,如果选择器不是这些,则返回超级实现的值。请记住在您的 xib 中设置自定义 UIWebView 子类名称。

【讨论】:

以上是关于如何在 UIMenuController 中删除 COPY UIMenuItem的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UIMenuController 中删除粘贴?

如何从 iOS 的 UIMenuController 中删除默认的 UIMenuItem?

如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?

如何从 UIMenuController 中删除 Copy、Select All、Define menuItem

从 UIMenuController 中删除自定义菜单项

从 UIMenuController 中删除复制、查找和共享