Ладно, это отвлекало меня на пару часов, но я, наконец, заставил его работать! Кажется, проблема в том, что UISearchDisplayController отслеживает, скрыл ли он панель навигации, и, если это так, восстановит его после закрытия представления. Вот почему со многими ответами, приведенными выше, вы видите хвостовую часть анимации полосы, скрывающейся при нажатии на новый вид. Однако, обманув контроллер отображения поиска, мы можем изменить это поведение.
Первый: подкласс UISearchDisplayController
После ответа о том, как сохранить контроллер навигации от сокрытия, найденного здесь , я изменил код, чтобы скрыть панель навигации:
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
if(self.active == visible)
return;
[self.searchContentsController.navigationController setNavigationBarHidden:YES animated:YES];
[super setActive:visible animated:animated];
if (visible)
[self.searchBar becomeFirstResponder];
else{
[self.searchBar resignFirstResponder];
[self.searchContentsController.navigationController setNavigationBarHidden:NO animated:YES];
}
}
Обратите внимание, что мы скрываем панель навигации перед вызовом функции super setActive. Это, кажется, удерживает суперкласс от попытки скрыть панель навигации и, следовательно, от попытки восстановить ее после выбора предметов. Теперь, когда контроллер станет активным, панель будет скрыта как обычно. Также обратите внимание, что мы восстанавливаем панель навигации, когда searchBar подает в отставку первый респондент. Это восстановит планку, если мы отменим выход из контроллера.
Второе: скрыть панель навигации при выходе
Если скрыть панель навигации, то в представлении исчезнет, она будет скрыта:
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
Третье: скрыть панель навигации при возврате
Единственная проблема сейчас заключается в том, что если мы выберем строку из отфильтрованного табличного представления, когда мы вернемся, панель навигации будет видимой. Чтобы это исправить, нужно поставить галочку в поле зрения:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(self.isFiltered){
[self.navigationController setNavigationBarHidden:YES animated:NO];
}
}
Хотя это похоже на огромный взлом, это делает трюк, и я не вижу лучшего способа сделать это.