【问题标题】:How do I add a custom UIMenuItem to the UIMenuController in a UITextView?如何将自定义 UIMenuItem 添加到 UITextView 中的 UIMenuController?
【发布时间】:2011-03-17 02:06:57
【问题描述】:

我正在尝试在 UITextView 中的“复制”、“粘贴”项旁边添加一个菜单项。我创建了一个 UITextView 的子类,并在此处从苹果的文档中复制了示例:

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/Text/Text.html#//apple_ref/doc/uid/TP40009370-CH8-SW28

我只是在 IB 中创建了一个 UiTextView 并将其类设置为我的 CustomTextView 类。不幸的是,这没有用。虽然,如果我将我的 CustomTextView 设置为 UIView 的子类,它工作得很好。这里有什么帮助吗?

我在这里也做了一个非常简单的示例项目:

apps.popsweet.com/TextViewTrial.zip

【问题讨论】:

    标签: iphone objective-c cocoa ipad


    【解决方案1】:

    所以我最终使用了下面的代码和我想要的结果,我将以下块放在我的视图控制器的 viewDidLoad 方法中,正如 Alex 所暗示的那样:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Change Color" action:@selector(changeColor:)];
        [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];
        [menuItem release]; 
    }
    

    然后我在视图控制器中添加了以下内容,以便在我命名为“textView”的 UITextView 中选择文本时有条件地显示项目:

    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
        if (action == @selector(changeColor:)) {
            if (textView.selectedRange.length > 0) {
                return YES;
            }
        }
        return NO;
    }
    

    我选择将 canPerformAction:withSender: 方法放置在视图控制器中而不是自定义 UITextView 类中,因为这样其他选项(例如复制、剪切、粘贴等)的行为就像调用该方法后的正常行为一样在响应者链上的每个对象上。

    【讨论】:

    • +1 但是,当我这样做时,changeColor 方法指向我的自定义 TableViewCell 类并崩溃,因为它不存在。我可以将它指向视图控制器吗?
    • 您可能需要确保 UIWindow 是关键窗口并实现此方法: - (BOOL)canBecomeFirstResponder { return YES; }
    【解决方案2】:

    通过执行以下操作,我只能创建一个始终出现在弹出菜单中的自定义菜单项:

    - (void) setUpCustomMenu {
    Class cls1 = NSClassFromString(@"UIMenuController");
    Class cls2 = NSClassFromString(@"UIMenuItem");
    if (cls1 && cls2)
        if ([UIMenuController instancesRespondToSelector:@selector(setMenuItems:)]) {
                UIMenuItem* item1 = [[UIMenuItem alloc] initWithTitle:@"My Menu Item" action:@selector(myMenuAction:)];
                [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:item1, nil];;
                [item1 release];
        }
    }
    

    这在视图控制器的 viewDidLoad 中被调用。

    我仍在努力通过拦截调用菜单控制器的事件来有条件地仅显示我的菜单项(例如,如果选择了某些内容)。到目前为止,我无法做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多