我有一个行为正常的 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
感谢您的任何想法!