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)
        }
}
Другие вопросы по тегам