Iphone UISearchBar赢得';移动到其他视图控制器时,在resignFirstResponder上隐藏键盘

Iphone UISearchBar赢得';移动到其他视图控制器时,在resignFirstResponder上隐藏键盘,iphone,ios,uisearchbar,resignfirstresponder,Iphone,Ios,Uisearchbar,Resignfirstresponder,我有一个行为正常的UISearchBar——如果我点击“搜索”或“取消”,键盘就会消失 但是,当我在导航堆栈上按下新的视图控制器时,如果键盘打开,它将不会关闭。它停留在旧的视图控制器中,如果我导航回它,键盘仍然显示 我被难住了,因为我的searchBarShouldEndEditing方法按预期调用,而我做到了[activeSearchBar辞职FirstResponder]。这适用于“搜索”或“取消”,但在视图消失触发时不起作用 我的代理代码: #pragma mark Search bar

我有一个行为正常的UISearchBar——如果我点击“搜索”或“取消”,键盘就会消失

但是,当我在导航堆栈上按下新的视图控制器时,如果键盘打开,它将不会关闭。它停留在旧的视图控制器中,如果我导航回它,键盘仍然显示

我被难住了,因为我的searchBarShouldEndEditing方法按预期调用,而我做到了[activeSearchBar辞职FirstResponder]。这适用于“搜索”或“取消”,但在视图消失触发时不起作用

我的代理代码:

#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

谢谢你的建议

好吧,我找到了一个解决方案,虽然不是很好

在父视图控制器中,我将以下行放在将触发新视图控制器推送到导航堆栈上的任何内容之前:

[self.view endEditing:YES];

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

您也可以:在.h文件中声明searchBar变量,生成属性等。。。然后在按钮上单击事件方法,该方法将推送另一个视图,并写入第一行:

[yourSearchBar resignFirstResponder]; 

这似乎有点明显,但您是否尝试过在ViewWillEnglishe中调用以从UISearchBar中退出FirstResponder?这应该可以。这对我来说有点痛苦,因为我的搜索栏隐藏在视图层次结构中有点深,但我看不出为什么它不起作用。。。主要的技巧似乎是在视图消失之前辞职FirstResponder。