2013-09-23 6 views
9

Я с трудом с моей SearchDisplayViewController на прошивке 7. У меня есть SearchBar скрытой над UITableViewController, какНеприятности с UISearchBar UISearchDisplayViewController

self.tableView.tableHeaderView = searchBar; 

Проблема заключается в том, что, когда я нажимаю на SearchBar к введите что-то, тогда представление начнет седеть, и я быстро коснусь экрана в случайной точке, чтобы отклонить его, вернувшись в таблицуView, поисковый бар исчезает. Полностью. Только на iOS 7.

Отладка, рама всегда одна и та же: 0,0,320,44. Но бар невидим!

также попытался сделать

self.tableView.contentOffset = CGPointMake(0,self.searchDisplayController.searchBar.frame.size.height); 

еще исчезает, когда я делаю это быстро.

На iOS 6 все работает отлично. Насколько я вижу, проблема только в iOS 7.

Я не знаю, от чего это зависит, кто-нибудь столкнулся с той же проблемой, что и у меня?

+0

Если вы обратитесь к таблицеView, да, это – Phillip

+0

oop. uitableviewcontroller находится прямо здесь, в вопросе, извините. в общем случае строка поиска не входит в заголовок таблицы. Это проблема. tableview в tablevc будет серым, когда поиск станет активным (в любой версии os, я думал). заголовок является частью представления таблицы. – danh

+0

Хм, я понял. То, что я хотел сделать, это скрыть searchBar над navigationController, поэтому, когда пользователь прокручивается вниз, появляется searchBar, как и в приложении Mail. Это случается только с iOS 7, и только если я быстро нажму на него после того, как он станет активным. На iOS 6 он отлично работает, даже если это не так. – Phillip

ответ

18

Начиная с Double tap UISearchBar with search delegate on iOS 7 causes UISearchBar to disappear, я нашел обходное решение для фактической работы и устранения ошибки - пока.

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller 
{ 
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { 
     [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView]; 
    } 
} 
+0

Welp, спасибо за это. iOS 7 была одной большой неудобной ошибкой за другой! – powerj1984

+0

Приятное простое исправление, спасибо! – ekscrypto

3

У меня была такая же проблема с iOS 7, и я решил это из документации на яблоко. Ошибка большинства людей заключается в том, что они связывают переменную 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; 
+0

Теперь мне только интересно, как это сделать в IB (без перехода на раскадровки прямо сейчас)? – oh7lzb

4

я столкнулся с теми же проблемами, и заметил, что searchDisplayControllerDidEndSearch был вызываются дважды. В первый раз супервизор self.searchDisplayController.searchBar - это UITableView, а во второй раз он по-прежнему UIView.

С принятого ответом, я беспокоюсь о непреднамеренных последствиях или ненужных накладных расходах от повторной установки подвида каждых раз панели поиска дважды постучали, и я также беспокоиться о том, что разрыве с будущей версиями IOS. К счастью, мы можем воспользоваться SuperView странности, как это:

- (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 для этого, но я не смог найти подходящий крючок, чтобы переопределить текущее поведение.

0

Более утонченный подход к решению @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]; 
    } 
} 

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

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

Смежные вопросы