我在我的应用程序中实现了一个UISearchBar。我以编程方式创建它并在视图控制器(而不是tableview)中使用它。它工作得很好,但我遇到的问题是使用手势识别器来解除键盘。我希望当用户点击键盘外的屏幕时,键盘会被解除。
我知道有很多解决方案可以解决这个问题,但我有一个相当独特的问题,我现在无法弄清楚。我使用以下代码来实现它。
我把这一行放在了我的ViewController的viewDidLoad方法中:
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:search action:@selector(resignFirstResponder)]];
此方法正常工作,但我的视图控制器以模态方式显示视图,因此它具有以下结构:
ViewController - modally - > view2 -modally - >的 VIEW3
当视图2和3被解除并且我返回ViewController时,手势识别器不再起作用。我在尝试另一种解决方案时遇到了同样的问题:
UIGestureRecognizer* cancelGesture;
- (void) backgroundTouched:(id)sender {
[self.view endEditing:YES];
}
#pragma mark - UISearchBarDelegate
-(void)searchBarTextDidBeginEditing:(UISearchBar *)search {
cancelGesture = [UITapGestureRecognizer new];
[cancelGesture addTarget:self action:@selector(backgroundTouched:)];
[self.view addGestureRecognizer:cancelGesture];
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)search {
if (cancelGesture) {
[self.view removeGestureRecognizer:cancelGesture];
}
}
我将这些添加到我的主ViewController中,并且它再次正常工作,但从模态视图返回后,手势不再有效。
欢迎任何帮助!
编辑1:
因此,在测试时,我发现按下键盘上的搜索按钮时会产生类似的效果。按下搜索后,我使用以下代码关闭键盘:
- (void) searchBarSearchButtonClicked:(UISearchBar *)search
{
[search resignFirstResponder];
}
这里的效果相同,当我第一次启动应用程序并进行一些搜索时工作正常,但是从我的模态显示的视图控制器返回到此屏幕后,按Enter键不再解除键盘。
编辑2:
我甚至尝试在searchBarSearchButtonClicked委托方法中添加这段代码:
- (void) searchBarSearchButtonClicked:(UISearchBar *)search
{
if ([search isFirstResponder]) {
[search resignFirstResponder];
NSLog(@"text field was first responder");
} else {
[search becomeFirstResponder];
[search resignFirstResponder];
NSLog(@"text field was not first responder");
}
}
两次都打印出文本字段是第一个响应者。从模态视图返回并再次单击搜索栏后,它仍然表示它是第一个响应者,但它不会忽略哪个非常奇怪。任何对此的见解都会非常有用,谢谢。
答案 0 :(得分:1)
好的,我想出了问题所在。他们的第一响应者正在辞职,但由于焦点问题键盘没有消失。模态视图上有一个默认行为,不会解除键盘(这显然不是一个bug)。因此,从模态视图返回后,它仍然具有此行为(辞职第一响应者但不解除键盘)。我解决这个问题的方法是将以下代码放在模态视图.m文件中:
- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}
这为我解决了。然后使用:
[search resignFirstResponder];
或
[self.view endEditing: YES];
键盘会解散!
答案 1 :(得分:0)
而不是在-(void)searchBarTextDidBeginEditing:(UISearchBar *)search {
和-(void)searchBarTextDidEndEditing:(UISearchBar *)search {
中添加和移除您的手势,而不是viewWillAppear' (add here) and
viewDidDisappear'(在此处删除)。
并假设您的cancelGesture
是具有retain
属性的属性。添加手势时,请执行此操作
UITapGestureRecognizer *gesture = [UITapGestureRecognizer new];
[gesture addTarget:self action:@selector(backgroundTouched:)];
self.cancelGesture = gesture;
[self.view addGestureRecognizer:self.cancelGesture];
并记得在cancelGesture
中发布dealloc
。