我已经在我的应用程序中实现了一个 UISearchBar。我以编程方式创建了它,并在视图控制器(不是表格视图)中使用它。它工作得很好,但我遇到的问题是使用手势识别器来关闭键盘。我希望当用户点击键盘外的屏幕时关闭键盘。
我知道有很多解决方案可以解决这个问题,但我有一个相当独特的问题,我目前无法弄清楚。我已经使用以下代码来实现这一点。
我将此行放在 ViewController 的 viewDidLoad 方法中:
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:search action:@selector(resignFirstResponder)]];
此方法正常工作,但是我的视图控制器以模态方式呈现视图,因此它具有以下结构:
ViewController - 模态 -> view2 -模态 - > 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");
}
}
两次都显示文本字段是第一响应者。从模态视图返回并再次单击搜索栏后,它仍然说它是第一响应者,但它不会解散,这很奇怪。对此的任何见解都会非常有帮助,谢谢。