当我触摸标签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];
}
这仍然是一个糟糕的解决方案 - 我无法在搜索和滚动搜索结果时隐藏键盘。
有什么建议吗?
答案 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的选择器。
我的英语不好。希望你明白我的观点并尝试一下。