自定义UIMenuController问题

时间:2014-03-04 07:25:19

标签: ios uitableview uitextview uimenucontroller uimenuitem

我在View Controller上有一个UITable和一个UITextView。我希望有一个自定义的UIMenuController,当我长按tableviewcell时我会选择'Copy'和'Info',我希望在UITextView的longpress上有默认的UIMenuController。

我搜索了一个解决方案,现在我可以创建一个自定义的UIMenuItem“信息”。但是,当我长按UITextView时,我看到也附加了“信息”。

如何仅为UITableView而不是UITextView设置自定义UIMenuController?我想在UITextView中单独使用默认选项。

2 个答案:

答案 0 :(得分:0)

在这里稍晚,我也有同样的问题,默认的UIMenuController默认项目被添加到自定义项目作为整个应用程序的共享实例控件。
您应该将UITextView子类化并添加方法:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
      if ( action== @selector(yourMethodInfo:)) {
                    return NO; }

                     return YES;

    }

也不要使用UIMenuController的sharedInstance并为Custom TextView子类创建一个单独的对象并使用它。从UITableView调用UIMenuController后,你应该执行[menuController setMenuItems:nil]; [menuController setMenuVisible:NO]; [menuController update]; menuController= nil; 在选择器方法上选择菜单项后。


如果有人需要更多参考资料让我知道,我可以提供更多解释。

答案 1 :(得分:0)

你的问题:

  

如何仅为UITableView而不是UITextView设置自定义UIMenuController?我想在UITextView中单独使用默认选项。

答案是:你不能

原因:您只能通过调用类方法获取UIMenuController实例:[UIMenuController sharedMenuController]。请参阅Apple的文档:UIMenuController

如何解决问题:

设置自定义UIMenuItems nil当共享UIMenuController将隐藏时。

示例代码:

-(void)longPress:(UILongPressGestureRecognizer*)gesture {
    //other stuff code...
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMenuWillShowNotification:) name:UIMenuControllerWillShowMenuNotification object:nil];
}

-(void)handleMenuWillShowNotification:(NSNotification*)notification {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillShowMenuNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMenuWillHideNotification:) name:UIMenuControllerWillHideMenuNotification object:nil];
}

-(void)handleMenuWillHideNotification:(NSNotification*)notification {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillHideMenuNotification object:nil];
    UIMenuController *menuController = notification.object;
    [menuController setMenuItems:nil];
}