当移动到另一个视图控制器时,UISearchBar在resignFirstResponder时无法隐藏键盘

3
我有一个UISearchBar,它的行为很正常 - 如果我点击“搜索”或“取消”,键盘会消失。
然而,当我在我的导航栏中推出一个新的视图控制器时,如果键盘是打开的,它不会关闭。它仍然停留在旧的视图控制器中,如果我回到它,键盘仍然显示。
我感到困惑,因为我的searchBarShouldEndEditing方法按预期被调用了,并且我做了[activeSearchBar resignFirstResponder]。这适用于“搜索”或“取消”,但不适用于视图消失触发的情况。
我的代理代码:
#pragma mark Search bar delegate methods__________________________

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)activeSearchBar
{
    NSLog(@"searchBarShouldBeginEditing");
    [activeSearchBar setShowsCancelButton:TRUE animated:YES];

    if (!showSearchType)
        return TRUE;

    if([UIView respondsToSelector:@selector(animateWithDuration:animations:)]) {
        // iOS 4.0 and later
        [UIView animateWithDuration:0.3 animations:^ {
            searchTypeView.frame = CGRectMake(0, 44, 320, 69);
            searchTypeView.bounds = CGRectMake(0, 0, 320, 69);
            grayBg.alpha = 0.6;
        }];
    } else {
        // Before iOS 4.0
        searchTypeView.frame = CGRectMake(0, 44, 320, 69);
        searchTypeView.bounds = CGRectMake(0, 0, 320, 69);
        grayBg.alpha = 0.6;
    }

    self.frame = CGRectMake(0, 0, 320, 113);

    [self bringSubviewToFront:searchTypeView];
    [self bringSubviewToFront:activeSearchBar];

    return TRUE;
}


- (BOOL)searchBarShouldEndEditing:(UISearchBar *)activeSearchBar
{
    NSLog(@"searchBarShouldEndEditing");

    if ([activeSearchBar isFirstResponder]) {
        NSLog(@"activeSearchBar isFirstResponder");
    }
    [activeSearchBar resignFirstResponder];

    [activeSearchBar setShowsCancelButton:FALSE animated:YES];

    if (!showSearchType)
        return TRUE;

    if([UIView respondsToSelector:@selector(animateWithDuration:animations:)]) {
        // iOS 4.0 and later
        [UIView animateWithDuration:0.3 animations:^ {
            searchTypeView.frame = CGRectMake(0, 9, 320, 69);
            searchTypeView.bounds = CGRectMake(0, 0, 320, 0);
            grayBg.alpha = 0;
        }];
    } else {
        // Before iOS 4.0
        searchTypeView.frame = CGRectMake(0, 9, 320, 69);
        searchTypeView.bounds = CGRectMake(0, 0, 320, 0);
        grayBg.alpha = 0;
    }

    self.frame = CGRectMake(0, 0, 320, 44);

    return TRUE;
}

- (void)searchBarTextDidEndEditing:(UISearchBar *)activeSearchBar {
    NSLog(@"searchBarTextDidEndEditing");

    if ([activeSearchBar isFirstResponder]) {
        NSLog(@"activeSearchBar isFirstResponder");
    }

    [activeSearchBar resignFirstResponder];

}

- (void)searchBarCancelButtonClicked:(UISearchBar *)activeSearchBar
{
    NSLog(@"searchBarCancelButtonClicked");

    [activeSearchBar resignFirstResponder];
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar
{
    NSLog(@"searchBarSearchButtonClicked");

    self.query = searchBar.text;

    [activeSearchBar resignFirstResponder];

    [searchView startSearch];
}

这会输出:
2011-12-07 20:00:33.061 MyApp[55725:307] searchBarShouldEndEditing
2011-12-07 20:00:33.063 MyApp[55725:307] activeSearchBar isFirstResponder
2011-12-07 20:00:33.066 MyApp[55725:307] searchBarTextDidEndEditing

感谢任何有关IT技术的想法!
2个回答

6
你可以在.h文件中声明searchBar变量,将其设置为属性等。然后,在你的按钮点击事件方法中,推出另一个视图之前,写下第一行代码:
[yourSearchBar resignFirstResponder]; 

这应该可以工作。在我的情况下有点麻烦,因为我的搜索栏深埋在视图层次结构中,但我没有看到任何理由它不能工作...主要的技巧似乎是在视图消失之前先resignFirstResponder。 - alex_c

2

好的,我找到了一个解决方案,虽然它不太好。

在父视图控制器中,我在任何触发新视图控制器被推入导航栏堆栈之前添加了以下行:

[self.view endEditing:YES];

这似乎有点脆弱和容易出错...我很想知道是否有更好的方法。

1
这似乎很明显,但您是否尝试在viewWillDisappear中调用UISearchBar的resignFirstResponder方法? - reddersky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接