摆脱 UIMenuController 中的标准项目

Posted

技术标签:

【中文标题】摆脱 UIMenuController 中的标准项目【英文标题】:Getting rid of the standard items in an UIMenuController 【发布时间】:2012-11-04 19:28:46 【问题描述】:

我正在开发一个非常小的 ios 编辑器。它只有一个视图、一个按钮和一个 textView。按下按钮时,会弹出一个自定义 UIMenuController,其中包含 3 个选项:切换粗体、切换斜体和切换草书。

这很好用,但是,如果我在 UITextView 是第一响应者时按下按钮,它还会显示两个默认菜单项,名为“选择”和“全选”。

我想摆脱它们,但我不知道该怎么做。这是按下按钮时调用的代码:

- (IBAction)settingsPressed:(id)sender

    UIMenuController *sharedController = [UIMenuController sharedMenuController];

    UIMenuItem *menuItem1 = [[UIMenuItem alloc] initWithTitle:bold ? @"Bold off" : @"Bold on" action:@selector(toggleBold:)];
    UIMenuItem *menuItem2 = [[UIMenuItem alloc] initWithTitle:italics ? @"Italics off" : @"Italics on" action:@selector(toggleCursive:)];
    UIMenuItem *menuItem3 = [[UIMenuItem alloc] initWithTitle:underline ? @"Underline off" : @"Underline on" action:@selector(toggleUnderline:)];

    NSArray *menuItems = @[menuItem1, menuItem2, menuItem3];

    CGRect drawRect = [sender convertRect:[sender bounds] toView:self.view];
    [sharedController setTargetRect:drawRect inView:self.view];

    [sharedController setMenuItems:menuItems];
    [sharedController setMenuVisible:YES animated:YES];

    [sharedController setMenuItems:nil];

谁能解释我如何做到这一点?

谢谢!

【问题讨论】:

【参考方案1】:

创建UITextView 的子类。在您的子类中,如果操作是 @selector(select:)@selector(selectAll:),则覆盖 canPerformAction:withSender: 以返回 NO。欲了解更多信息:

Managing the Selection and Edit Menu UIMenuController Class Reference -[UIResponder canPerformAction:withSender:] UIResponderStandardEditActions Protocol Reference

【讨论】:

太棒了!感谢您的回答,我会尝试实现这个:) 没有子类化是否可行?我正面临 UIWebView 的这个问题,但覆盖 fmk 使用的实现的选项有限......

以上是关于摆脱 UIMenuController 中的标准项目的主要内容,如果未能解决你的问题,请参考以下文章

关于在 Swift 中删除 WKWebView 中的 UIMenuController 默认 menuItems 的问题

自定义 UIMenuController

从 TableView 中的 UIMenuController 中删除默认剪切、复制、粘贴

在哪里向 UIMenuController 添加自定义菜单项?

从 UIMenuController 中删除自定义菜单项

UIMenuController 显示错误的项目