从模态视图返回后,用手势识别器关闭UISearchBar的键盘

时间:2013-02-13 12:44:55

标签: ios uigesturerecognizer uisearchbar uitapgesturerecognizer

我在我的应用程序中实现了一个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");
    }
}

两次都打印出文本字段是第一个响应者。从模态视图返回并再次单击搜索栏后,它仍然表示它是第一个响应者,但它不会忽略哪个非常奇怪。任何对此的见解都会非常有用,谢谢。

2 个答案:

答案 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