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

(Это очень длинный код, поэтому не знаю, что мне здесь размещать).


person Max    schedule 30.08.2013    source источник


Ответы (4)


хорошо и на всякий случай, если кто-то столкнется с такой ситуацией. Я реализовал обходной путь для вышеуказанной ситуации.

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

person Max    schedule 06.09.2013

-(void)viewDidLayoutSubviews{
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}

он не скроет панель навигации.

person Vineesh TP    schedule 15.10.2013

В случае, если кто-то страдает от этой проблемы ... Вот мое решение.

-(void) viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  // check if searchDisplayController still active..
  if ([searchDisplayController isActive]) {
    [searchDisplayController setActive:NO];
  }
}
person Adison    schedule 06.11.2013
comment
Спасибо! Ваш ответ сработал для меня лучше всего, потому что я использовал поиск с фильтрами, а другие решения удаляли поиск до того, как я закончил вводить текст. Ваш удаляет поиск после того, как я полностью закончу. - person Tommie C.; 09.04.2014

Мое исправление работает

  override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        DispatchQueue.main.async {
            self.navigationController?.setNavigationBarHidden(true, animated: false)
        }
}
person RomanV    schedule 30.01.2019