UISearchDisplayController скрывает панель навигации
Я вижу странную ситуацию. Я поместил панель поиска в панель навигации и связал UISearchDisplayController с панелью поиска. Теперь контроллер отображения поиска стремится скрыть панель навигации, когда пользователь нажимает на панель поиска (следовательно, скрывает и панель поиска). Чтобы противостоять этому, я создал подкласс UISearchDisplayController и реализовал следующий код:
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
[super setActive: visible animated: animated];
[self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
}
Теперь это исправило исходную проблему. Я могу искать и переходить на другие контроллеры.
Однако предположим, что я выполняю поиск на контроллере представления A, а затем нажимаю на результат поиска, который затем помещает контроллер представления B в стек навигации. Теперь, если я открою контроллер вида B и вернусь обратно к A, моя навигационная панель исчезнет. Похоже, что контроллер отображения поиска активен и поэтому скрывает панель навигации.
Если я сделаю контроллер отображения поиска неактивным, а затем нажму кнопку просмотра контроллера B и затем выскочу на него, появится панель навигации.
Итак, есть ли способ, чтобы мой контроллер отображения поиска мог оставаться активным, и панель навигации не исчезала, когда я выдвигал контроллер представления B из стека навигации?
И я ориентируюсь на iOS6
(Это очень длинный код, поэтому не уверен, что я должен публиковать здесь).
3 ответа
Хорошо и на всякий случай, если кто-то сталкивается с такой ситуацией. Я реализовал обходной путь для вышеуказанной ситуации.
Проблема заключалась в том, что, когда я извлекал контроллер представления B из стека навигации, searchDisplayController все еще был активен в контроллере представления A. Теперь searchDisplayController предполагает, что панель поиска всегда должна быть ниже панели навигации (AFAIK). Следовательно, он не отображал панель навигации, когда контроллер представления A снова отображался. Чтобы это исправить, я написал следующий код в функции viewWillLayoutSubviews контроллера представления A.
-(void)viewWillLayoutSubviews
{
if(self.searchDisplayController.isActive)
{
[UIView animateWithDuration:0.001 delay:0.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
[self.navigationController setNavigationBarHidden:NO animated:NO];
}completion:nil];
}
[super viewWillLayoutSubviews];
}
Вышеприведенное обеспечивает анимацию, так что, когда пользователь открывает контроллер представления B, контроллер представления A показывает активированную панель поиска (если пользователь ранее пытался что-то искать, прежде чем перейти к просмотру контроллера B). Это не очень плавный переход, но он работает:) ....
Примечание:- Не используйте вышеуказанный код в viewDidLoad
или же viewDidAppear
функции, поскольку это может обеспечить нежелательную анимацию.
-(void)viewDidLayoutSubviews{
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
он не будет скрывать панель навигации.
На случай, если кто-то пострадает от этой проблемы. Вот мое решение.
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// check if searchDisplayController still active..
if ([searchDisplayController isActive]) {
[searchDisplayController setActive:NO];
}
}
Мое исправление работает
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
DispatchQueue.main.async {
self.navigationController?.setNavigationBarHidden(true, animated: false)
}
}