Сохранение панели навигации UINavigationController скрытой после выбора UISearchDisplayController - PullRequest
16 голосов
/ 26 февраля 2010

У меня есть UISearchDisplayController установка с UITableViewController, которая вложена в UINavigationController.Когда выбор ячейки сделан, запускается метод UITableView's didSelectRowAtIndexPath, который отправляет новое представление в родительский навигационный контроллер.В этом новом представлении при входе должна быть скрыта панель навигации.

[[self navigationController] setNavigationBarHidden:YES animated:NO];

Я использую эту строку в методе didSelectRowAtIndexPath, чтобы скрыть панель навигации.Это прекрасно работает, когда строка выбрана без использования контроллера поиска, но переопределяется при выборе результата поиска.Кажется, что UISearchDisplayController получает право скрывать навигационную панель через некоторое время после выбора строки.

Если я переместу вызов setNavigationBarHidden в метод целевого представления viewWillAppear, результаты будут аналогичными,Я могу заставить его работать, поместив вызов скрытия в viewDidAppear, но это создает очень неудобный эффект перехода , который ощущается нервным и неуместным.Я хотел бы сделать навигационную панель уже скрытой, прежде чем новый вид будет перемещен на экран.

Кто-нибудь знает, где происходит отображение панели навигации, и / или каким-либо образом я могу переопределить это поведение?

Ответы [ 5 ]

6 голосов
/ 14 июня 2011

Возможно, это не самое элегантное решение, но я верю, что оно делает именно то, что вы хотите. Я столкнулся с подобной проблемой, и мое решение состояло в том, чтобы иметь метод, который скрывает панель навигации, которая вызывается с задержкой 0 секунд следующим образом.

Метод, который вызывается:

-(void) hideNavBar {
    if (self.navigationController.navigationBar.hidden == NO)
    {
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    }
}

Затем в методе viewDidLoad у меня есть следующее:

[self performSelector:@selector(hideNavBar) withObject:nil afterDelay:0.0];

Это работает и удаляет панель навигации одним мгновенным махом. Вы можете изменить время задержки, если хотите, чтобы анимация была удалена после задержки. Я попытался [self hideNavBar], но это просто не сработало, поэтому придерживался того, что у меня есть выше.

Надеюсь, это поможет, и если у кого-то есть более элегантное решение, мне будет интересно!

2 голосов
/ 06 апреля 2013

Ладно, это отвлекало меня на пару часов, но я, наконец, заставил его работать! Кажется, проблема в том, что 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];
    }

}

Хотя это похоже на огромный взлом, это делает трюк, и я не вижу лучшего способа сделать это.

1 голос
/ 13 октября 2010

Столкнулся с той же проблемой, сумел заставить ее работать гладко с этим уродливым хаком:

- (void) viewWillDisappear: (BOOL) animated 
{
    if (searchController_.active)       
    {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
        self.navigationController.navigationBar.tintColor = nil;        
    }

    [super viewWillDisappear: animated];
}


- (void) viewWillAppear: (BOOL) animated 
{       
    if (searchController_.active)       
    {
        self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
    }

    [super viewWillAppear: animated];
}
0 голосов
/ 10 января 2013
- (void) viewWillDisappear: (BOOL) animated
{
    // self.searchOn property tell if full screen search is enabled
    //if (self.searchOn)
    //{

        [self.navigationController setNavigationBarHidden:NO animated:NO];
    //}

    [super viewWillDisappear: animated];
}


- (void) viewWillAppear: (BOOL) animated
{
    //if (self.searchOn)
    //{
         [self.navigationController setNavigationBarHidden:YES animated:YES];
    //}

    [super viewWillAppear: animated];
}
0 голосов
/ 13 мая 2012

У меня была та же проблема: у моего вида панель навигации по умолчанию скрыта, и вот способ ее скрыть:

-(void) viewWillLayoutSubviews{
  if (self.navigationController.navigationBar.hidden == NO)
  {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
  }
}

Таким образом, панель навигации не появляется даже после использования панели поиска.

...