Проблемы с UISearchBar \ UISearchDisplayViewController
Я испытываю затруднения с моим SearchDisplayViewController на iOS 7. У меня есть панель поиска, скрытая над UITableViewController, например
self.tableView.tableHeaderView = searchBar;
Проблема в том, что когда я нажимаю на панели поиска, чтобы ввести что-то, то представление начинает затухать, и я быстро нажимаю на экран в произвольной точке, чтобы отклонить его, возвращаясь к tableView, searchBar исчезает. Полностью. Только на iOS 7, хотя.
Отлаживая его, кадр всегда один и тот же: 0,0,320,44. Но бар невидим!
Также пытался сделать
self.tableView.contentOffset = CGPointMake(0,self.searchDisplayController.searchBar.frame.size.height);
все еще исчезает, когда я делаю это быстро.
На iOS 6 работает просто отлично. Проблема только с iOS 7, насколько я вижу.
Я не знаю, от чего это зависит, кто-нибудь сталкивался с той же проблемой, что и я?
4 ответа
Что касается двойного нажатия UISearchBar с делегатом поиска на iOS 7, которое приводит к исчезновению UISearchBar, я нашел обходной путь, который действительно сработал, и решил эту ошибку - пока.
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
[self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
}
}
Я столкнулся с той же проблемой, и заметил, что searchDisplayControllerDidEndSearch
звонили дважды. Первый раз, супервьюз self.searchDisplayController.searchBar
это UITableView
и во второй раз это все еще UIView
,
С принятым ответом я беспокоюсь о непреднамеренных последствиях или ненужных накладных расходах от повторной вставки подпредставления каждый раз, когда дважды ударяется панель поиска, и я также беспокоюсь о том, что она сломается в будущих версиях iOS. К счастью, мы можем воспользоваться странностью супервизии, например так:
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
if (self.tableView != self.searchDisplayController.searchBar.superview) {
[self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
}
}
Если бы мне пришлось угадывать, что происходит, UISearchBar
автоматически создает временный UIView
как его супервизор, когда он активен - это вид, видимый при выполнении поиска. В то время как UISearchBar
увольняется, супервизия возвращается UITableView
раньше, если только он не был отклонен так быстро, что он никогда не был должным образом инициализирован, в этом случае он очищается ненадлежащим образом и UITableView
никогда не получает UISearchBar
назад как его ребенок.
Это решение все еще не идеально, и я думаю, что Apple, должно быть, делает что-то другое в своих собственных приложениях, потому что их панель поиска UX выглядит немного лучше. Я думаю, что было бы лучше не обрабатывать второй кран в первую очередь, пока UISearchBar
был готов. Я пытался использовать другой UISearchBarDelegate
методы, чтобы сделать это, но я не смог найти подходящий хук для переопределения текущего поведения.
У меня была та же проблема с iOS 7, и я решил ее из документации Apple. Ошибка большинства людей в том, что они связывают UISearchBar
переменная к self.searchDisplayController.searchBar
так же... НЕТ НЕТ..! Это две разные вещи!!! UISearchBar
должны быть объявлены и инициализированы, а затем обернуты в self.searchDisplayController
как searchBar, а затем обернут в self.tableView.tableHeaderView
при этом оно не исчезнет!!!
self.searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
self.searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
self.searchDisplayController.delegate = self;
self.searchDisplayController.searchResultsDataSource = self;
self.searchDisplayController.searchResultsDelegate = self;
[self.searchBar setPlaceholder:@"search the hell in me"];
self.tableView.tableHeaderView = self.searchDisplayController.searchBar;
Более тонкий подход к решению @lehrblogger:
- (void)addSearchDisplayControllerBackToTableView {
if ([self.searchDisplayController.searchBar isDescendantOfView:self.tableView] == NO) {
NSLog(@"Search bar is not in current table view, will add it back");
[self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
[self.searchDisplayController setActive:NO animated:YES];
}
}
Причина такого подхода: при поиске панель поиска перемещается в поисковый контейнер, а суперпредставление панели поиска всегда является другим видом, отличным от текущего представления таблицы.
Примечание. Это приведет к тому, что поиск будет отклонен, поскольку пользователь несколько раз нажал на панели поиска.