从 UIMenuController 中删除自定义菜单项

Posted

技术标签:

【中文标题】从 UIMenuController 中删除自定义菜单项【英文标题】:Get rid of custom menu items from UIMenuController 【发布时间】:2013-12-19 12:36:01 【问题描述】:

我正在使用UITableViewController。如果我长按tableview cell,我将在UIMenuController 中创建自定义菜单,并且工作正常(转发、回复)。在同一个视图中,我在底部有textview。如果我点击它应该显示正常操作,但它没有。它带有默认项目以及我为tableview cell(转发,回复)添加的项目。如何从UIMenuController 中删除自定义项或如何对特定单元格执行操作。

在单元格内我有一个UIImageView。我添加了手势来执行操作。

【问题讨论】:

你能隐藏默认项吗? 【参考方案1】:

为此,首先您创建一个包含自定义项目的菜单,然后收听UIMenuControllerWillHideMenuNotification 通知。当菜单要隐藏时,在此通知中,您可以删除您添加的项目。这是示例代码。

-(void) showMenu
     UIMenuController * menuController =[UIMenuController sharedMenuController];
     UIMenuItem * item1 = [[UIMenuItem alloc] initWithTitle:@"Goto" action:@selector(menuItem1Clicked:)];
     UIMenuItem * item2 = [[UIMenuItem alloc] initWithTitle:@"Edit" action:@selector(menuItem2Clicked:)];
     [menuController setMenuItems:@[item, item1]];
     [menuController setTargetRect:rect inView:self.view];
     [menuController setMenuVisible:YES animated:YES];

当菜单要隐藏时删除您添加的项目

-(void) menuControllerWillHide:(NSNotification*)notification

     UIMenuController * controller = [UIMenuController sharedMenuController];
     NSArray * items = [controller menuItems]; // These are all custom items you added
     NSMutableArray * finalItemsYouWant = [NSMutableArray array];
     // Here you can check what items you dont want and then remove it
     [controller setMenuItems:finalItemsYouWant];
 

【讨论】:

【参考方案2】:

您应该已经实现 canPerformAction:withSender: 以使您的自定义项目正常工作。在该方法中,您可以验证发送者以检查它是什么类/实例并决定要做什么。

或者,检查哪个实例是第一响应者。

【讨论】:

您是如何获得调用此方法的实例的?【参考方案3】:

斯威夫特3: 在 ViewController 的 viewDidLoad 中:

 NotificationCenter.default.addObserver(self, selector: #selector(menuControllerWillHide), name: NSNotification.Name.UIMenuControllerWillHideMenu, object: nil)

func menuControllerWillHide(notification:NSNotification)
    UIMenuController.shared.menuItems = []

【讨论】:

这就是我想要的!谢谢!【参考方案4】:
-(void)showMenu:(UILongPressGestureRecognizer *)longPressRecognizer  
  
    longPressRowNum = longPressRecognizer.view.tag;  
    NSIndexPath *indPath = [NSIndexPath indexPathForRow:longPressRecognizer.view.tag inSection:0];
    //Type cast it to CustomCell   
    UITableViewCell *cell = (UITableViewCell*)[projectTable cellForRowAtIndexPath:indPath];        
    ProjectDashBoard *projectDashBoard = [listRecord objectAtIndex:longPressRecognizer.view.tag];
    NSLog(@"long press project status---%@",projectDashBoard.projectStatus);

    if (longPressRecognizer.state == UIGestureRecognizerStateBegan) 



    UITableViewCell *selectedCell = (UITableViewCell *)longPressRecognizer.view;
    [selectedCell setSelected:YES];

    UIMenuItem *delete = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"deleteproject", nil)  action:@selector(deleteClicked:)];

    UIMenuController *menu = [UIMenuController sharedMenuController];

    if([projectDashBoard.projectStatus isEqualToString:statusActive])
        UIMenuItem *archive = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"archiveproject", nil)  action:@selector(archiveClicked:)];
        [menu setMenuItems:[NSArray arrayWithObjects:delete, archive, nil]];
    else
        UIMenuItem *archive = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"unarchiveproject", nil)  action:@selector(archiveClicked:)];
        [menu setMenuItems:[NSArray arrayWithObjects:delete, archive, nil]];
    

    [[UIMenuController sharedMenuController] update];
    [menu setTargetRect:cell.frame inView:cell.superview];
    [menu setMenuVisible:YES animated:YES];
 

【讨论】:

以上是关于从 UIMenuController 中删除自定义菜单项的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 UIMenuController 中删除 COPY UIMenuItem

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

UIMenuController 和响应者链:发生了啥?

使用自定义 UIMenuController 项从 UIPasteboard 中复制和检索值

如何在 UIMenuController 的自定义操作中获取点击的表格视图单元格