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