Проблемы с 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];
    }
}

Причина такого подхода: при поиске панель поиска перемещается в поисковый контейнер, а суперпредставление панели поиска всегда является другим видом, отличным от текущего представления таблицы.

Примечание. Это приведет к тому, что поиск будет отклонен, поскольку пользователь несколько раз нажал на панели поиска.

Другие вопросы по тегам