Контроллер Push/Pop View с навигационной панелью от контроллера просмотра без панели навигации

Я пытаюсь нажать контроллер вида с видимой навигационной панелью с контроллера просмотра со скрытой навигационной панелью.

Я пробовал всевозможные комбинации [[self navigationController] setNavigationBarHidden:YES animated:NO]; в viewWillAppear, viewDidAppear, viewWillDisappear... и т.д.

// First View Controller

@implementation FirstViewController

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

    NSLog(@"[%@ viewWillAppear]", self);
}

@end


// Second View Controller


@implementation SecondViewController

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

    NSLog(@"[%@ viewWillAppear]", self);
}

@end

Ничего не получилось. Я также пробовал настраиваемый код для "анимации" push и pop, который работает, НО я теряю салфетки и просматриваю панорамирование. Прежде чем я углубится, просто хочу убедиться, что я не изобретаю колесо.

Приложение Starbucks - это то, что я пытаюсь подражать.

Контроллер корневого представления приложения (вид темного фона) отображается в полноэкранном режиме и замечает, что у него нет UINavigationBar. Но когда вы нажимаете одну из кнопок, она нажимает на контроллер вида (светлый вид фона) с UINavigationBar. Оттуда, если вы нажмете стрелку "назад", она увидит, что контроллер вызывается навигационной панелью. Также работает интерактивный жест прокрутки.

Starbucks iOS App

Ответы

Ответ 1

Можно без взлома решения самостоятельно. Вот что вы делаете:

Корневой viewController:

@implementation ViewController

....

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

@end

И нажатый viewController:

@implementation SecondViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

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

@end

Это будет сделано. Он также поддерживает интерактивный переход;)

Мне кажется, что беспокоит, однако, что этот тип функциональности вообще не документирован яблоком. - Вы также можете скрыть и отобразить панели инструментов с этими "точками вызова" (внутри viewWillAppear:)

ИЗМЕНИТЬ

Я только понял, что это тот же код, который вы написали в своем вопросе. Повторите пробную проверку. Я на 100% уверен, что это работает - я использовал эту функцию в одном из моих приложений.

Также обратите внимание, что мой код использует animated:animated вместо вашего animated:NO. Это может быть решающим моментом здесь:)

Ответ 2

Я просто настроил два контроллера представления, чтобы проверить это взад и вперед.

@interface VC1 ()

@end

@implementation VC1

- (void)viewDidLoad {
[super viewDidLoad];
}

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

@end

и второй

#import "ViewControllerTwo.h"

@interface ViewControllerTwo ()

@end

@implementation ViewControllerTwo

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden = NO;
}

@end

VC1 встроен в navigationController (который является корневым контроллером для приложения), с кнопкой, которая перемещается в ViewControllerTwo. У меня есть push-сег из VC1 → ViewControllerTwo, этот метод работает. Когда я нажимаю на кнопку, контроллер вида виден на ViewControllerTwo, когда я нажимаю назад, навигационная панель исчезает.