Я столкнулся с этим, решая немного другую проблему. При использовании UISearchDisplayController я хочу, чтобы строка поиска была в панели навигации (не внизу).
Нетрудно поместить панель поиска в панель навигации (см. UISearchBar и UINavigationItem ). Однако UISearchDisplayController предполагает, что панель поиска всегда находится под панелью навигации и (как обсуждалось здесь) настаивает на том, чтобы при входе в поиск скрывать панель навигации, поэтому все выглядит ужасно. Кроме того, UISearchDisplayController окрашивает панель поиска светлее, чем обычно.
Я нашел решение. Хитрость заключается в том, чтобы (нелогично) отцепить UISearchDisplayController от управления любым UISearchBar вообще. При использовании xibs это означает удаление экземпляра панели поиска или, по крайней мере, отсоединение розетки. Затем создайте свой собственный UISearchBar:
- (void)viewDidLoad
{
[super viewDidLoad];
UISearchBar *searchBar = [[[UISearchBar alloc] init] autorelease];
[searchBar sizeToFit]; // standard size
searchBar.delegate = self;
// Add search bar to navigation bar
self.navigationItem.titleView = searchBar;
}
Вам нужно будет вручную активировать контроллер отображения поиска, когда пользователь нажимает на панель поиска (в -searchBarShouldBeginEditing:
), и вручную закрывать панель поиска, когда пользователь заканчивает поиск (в -searchDisplayControllerWillEndSearch:
).
#pragma mark <UISearchBarDelegate>
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
// Manually activate search mode
// Use animated=NO so we'll be able to immediately un-hide it again
[self.searchDisplayController setActive:YES animated:NO];
// Hand over control to UISearchDisplayController during the search
searchBar.delegate = (id <UISearchBarDelegate>)self.searchDisplayController;
return YES;
}
#pragma mark <UISearchDisplayDelegate>
- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController
*)controller {
// Un-hide the navigation bar that UISearchDisplayController hid
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController
*)controller {
UISearchBar *searchBar = (UISearchBar *)self.navigationItem.titleView;
// Manually resign search mode
[searchBar resignFirstResponder];
// Take back control of the search bar
searchBar.delegate = self;
}