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