Скрыть NavigationBar для одного ViewController в раскадровке

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

введите здесь описание изображения

Когда я отключаю Inferred Top Bar для моего основного контроллера представления, он исчезает в раскадровке, но по-прежнему отображается, когда я запускаю приложение. Когда я делаю то же самое с панелью навигации в NavController, она исчезает для всех трех (поскольку все они наследуют панель навигации без панели).

Я хочу показать NavBar в ScrollViewV View Controller, но скрыть его в MainViewController.

Все контроллеры имеют соответствующие файлы .h или .m, но я не понимаю, как это сделать программно. Дайте мне знать, если вам нужно увидеть что-нибудь еще. Спасибо много!


person Siriss    schedule 31.10.2012    source источник


Ответы (5)


В вашем mainViewController вы можете сделать следующее:

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

Возможно, вы захотите показать панель навигации при скрытии этого ViewController, для этого сделайте следующее:

- (void)viewDidDisappear: (BOOL)animated
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
    [super viewDidDisappear:animated];
}
person user427969    schedule 31.10.2012
comment
Спасибо за альтернативный ответ! - person Siriss; 01.11.2012
comment
Это был лучший ответ, чтобы переопределить viewWillAppear. Спасибо и извините за то, что не исследовали дальше, прежде чем ответить. - person Siriss; 01.11.2012
comment
Метод @KyleClegg viewDidLoad вызывается только в первый раз при создании ViewController. - person user427969; 19.03.2014
comment
Это не работает при возврате из контроллера представления со скрытой панелью навигации. - person Sam; 13.11.2015
comment
@Sam Да, вопрос заключался в том, чтобы скрыть только один контроллер просмотра. Если вы хотите вернуться к контроллеру представления, где панель навигации скрыта, удалите строку [self.navigationController setNavigationBarHidden:NO animated:animated];, чтобы панель навигации оставалась скрытой. - person user427969; 16.11.2015
comment
@user427969 user427969 извините, я имею в виду возврат от контроллера со скрытой панелью навигации к контроллеру, на котором она не скрыта. - person Sam; 16.11.2015
comment
@Sam Вы уверены, что реализовали viewDidDisappear, как указано в ответе? Другой вариант, который вы могли бы попробовать, - реализовать viewWillAppear в вашем родительском контроллере просмотра и установить [self.navigationController setNavigationBarHidden:NO animated:animated]; - person user427969; 17.11.2015
comment
ага, только что перепроверил. Я думаю, это потому, что другая анимация продолжается (поп) - person Sam; 19.11.2015
comment
делать это в willDissappear, кажется, работает лучше, за исключением модального представления нового VC (где вы получаете неприятную вспышку), поэтому я закончил с: - (void)viewWillDisappear: (BOOL)animated { [super viewWillDisappear:animated]; if (!self.presentedViewController) { [self.navigationController setNavigationBarHidden:NO animated:animated]; } } - person Sam; 19.11.2015

Если вы хотите сохранить что-то в раскадровке, отредактируйте определяемые пользователем атрибуты и установите navigationController.navigationBarHidden как проверенное логическое значение.

person keji    schedule 15.08.2014
comment
Это отличное предложение - person Siriss; 15.08.2014
comment
Это работает, но вы не сможете показать NavigationBar, используя тот же трюк в другом ViewController. (Определяемые пользователем атрибуты времени выполнения применяются во время загрузки пера, а не во время просмотраWillAppear) - person Berik; 08.06.2015

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

[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillAppear:animated];
person Remixed123    schedule 03.09.2013

Кто-нибудь хочет знать, как это сделать в Swift?

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.navigationController?.navigationBar.hidden = true
}
person instanceof    schedule 30.08.2016
comment
Из doc: если вы переопределяете этот метод, вы должны вызвать super в какой-то момент в вашей реализации. - person Johan; 30.12.2020
comment
Спасибо @Johan, отредактировал мой ответ. - person instanceof; 31.12.2020

person    schedule
comment
Спасибо! Так это означает, что, поскольку другие унаследованы, мне нужно будет сделать его видимым на других ViewControllers, которые у меня есть правильно? Это было действительно легко.... Еще раз спасибо. - person Siriss; 01.11.2012
comment
Кроме того, когда я нажимаю на NavBar в моем контроллере представления ScrollView, он снова показывает панель навигации в контроллере основного представления... Как мне сделать это постоянным? - person Siriss; 01.11.2012
comment
Вы имеете в виду, что вам нужно удалить панель навигации вообще? Это не очень хорошая идея, однако, если вам это все еще нужно, вам нужно расширить Nav Controller и в его viewDidLoad отключить его таким же образом: self.navigationBarHidden = YES; - person whiteagle; 01.11.2012
comment
Не полностью. Я хочу, чтобы он всегда оставался скрытым на моем главном контроллере представления, но отображался на контроллере представления ScrollView и любых других, которые я могу добавить. - person Siriss; 01.11.2012