UIMenuController显示错误的项目

时间:2014-11-07 01:21:20

标签: ios objective-c uimenucontroller

当我触摸标签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 个答案:

答案 0 :(得分:0)

一个解决方案: 你可以在自定义UIMenuController后重置UIMenuItems。 UIMenuControllerWillHideMenuNotification的addObserver。

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

然后在willHideEditMenu:function

-(void)willHideEditMenu:(NSNotification *)object
{
    //any other thing u want to do.
    [[UIMenuController shareMenuController] setMenuItems:nil]; 
}
这样,其他地方的UIMenuController单例就不会受到你自定义它所做的事情的影响。

其他解决方案: 我认为你有这个问题的根本原因是你有一些同名的" makeCall:"或" createNewContact:"在其他视图或viewcontroller(基本上可能在任何UIResponder中),即你有这个问题的地方的父视图(viewcontroler)。 检查响应者树,看看你是否能找到任何与UIMenuItem选择器名称相同的选择器。从那以后

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

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


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