UIMenuController 显示错误的项目

Posted

技术标签:

【中文标题】UIMenuController 显示错误的项目【英文标题】:UIMenuController showing wrong items 【发布时间】:2014-11-07 01:21:20 【问题描述】:

当我触摸标签时,UIMenuController 会出现在我的自定义项目列表中,效果很好。但是当UIMenuController 出现在标准UISearchBar 中时,我也会在那里看到我所有的自定义项目。为什么?

当我触摸标签时,我只需要显示标准 UISearchBar 和自定义项目的标准(复制、粘贴)项目。你能解释一下我应该怎么做吗?

更新

我做了什么(不是很好的解决方案):

如果我们有键盘,那就是搜索栏,如果我们没有,那就是标签。

标志,表示我将使用哪些项目列表

BOOL standardList;

注册键盘出现/消失

-(void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];


-(void)viewWillDisappear:(BOOL)animated

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];

    [super viewWillDisappear:animated];


-(void)keyboardWillShow:(id)sender

    standardList = YES;


-(void)keyboardWillHide:(id)sender

    standardList = NO;

并检查标志,在下一个方法中:

- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender


    if (selector == @selector(copy:))
    
        return YES;
    

    if (!standardList)
    
        if ((selector == @selector(makeCall:)) || (selector == @selector(createNewContact:)))
        
            return YES;
        
    

    return NO;

效果很好,但是:iPad 键盘有“隐藏键盘”按钮,并且键盘可以在没有[UISearchBar resingFirstResponder] 的情况下隐藏。

即使我添加下一行:

-(void)keyboardWillHide:(id)sender

    standardList = NO;
    [mySearchController setActive:NO];

这仍然是一个糟糕的解决方案 - 我无法在搜索和滚动搜索结果时隐藏键盘。

有什么建议吗?

【问题讨论】:

【参考方案1】:

一种解决方案: 自定义 UIMenuController 后,您始终可以重置 UIMenuItems。 UIMenuControllerWillHideMenuNotification 的 addObserver。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willHideEditMenu:) name:UIMenuControllerWillHideMenuNotification object:nil];

然后在 willHideEditMenu: 函数中

-(void)willHideEditMenu:(NSNotification *)object

    //any other thing u want to do.
    [[UIMenuController shareMenuController] setMenuItems:nil]; 

这样,其他地方的 UIMenuController 单例就不会受到你在哪里自定义它所做的影响。

其他解决方案: 我认为你有这个问题的根本原因是你在其他视图或视图控制器(基本上可能在任何 UIResponder 中)有一些同名的函数“makeCall:”或“createNewContact:”,它是父视图(viewcontroler)你有这个问题的地方。 所以检查响应器树,看看你是否可以找到任何与 UIMenuItem 选择器同名的选择器。因为

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender;

是任何 UIResponder 的函数,它可以被调用。如果它碰巧有一个同名的选择器,它可能会返回 YES,你就会遇到这个问题。要解决这个问题,只需重命名 UIMenuItem 的选择器即可。


我的英语不好。希望你明白我的意思并尝试一下。

【讨论】:

以上是关于UIMenuController 显示错误的项目的主要内容,如果未能解决你的问题,请参考以下文章

由于在应用程序的其他地方使用 UIMenuController,UISearchBar 显示错误的 UIMenuItems

如何从 UIMenuController 中删除粘贴?

确定何时解除 UIMenuController?

如何创建自定义 UIMenuController 仅包含默认项目以外的自定义项目?

在 UIView 上设置 UIMenuController

iOS:如何从 UIMenuController 获取选定的 UIMenuItem