Добавление дочернего представления в UITabBarController не вызывает viewWillAppear

У меня есть приложение на основе панели вкладок (iOS 7.1 SDK). Когда пользователь запускает приложение в первый раз, я хочу показать экран входа в систему. Я решил использовать сдерживание контроллера представления (это называется в контроллере первого представления контроллера панели вкладок):

LoginViewController *vc = [LoginViewController new];
[self.tabBarController addChildViewController:vc];
[vc didMoveToParentViewController:self.tabBarController];
[self.tabBarController.view addSubview:vc.view];

Но есть некоторые проблемы. View обычно виден, но в LoginViewController viewWillAppear и viewDidAppear никогда не вызываются. Я пытаюсь использовать этот фрагмент кода во всех методах жизненного цикла представления (viewDidLoad, viewWillAppear, viewDidAppear), но безуспешно. Я знаю, что есть и другие способы добиться того, что я пытаюсь сделать. Например, добавьте дочерний контроллер в первый контроллер представления контроллера панели вкладок и скройте панель вкладок, которая отлично работает, и обычно вызываются viewWillAppear и viewDidAppear. Но из-за этого мне становится еще более любопытно - почему добавление дочернего контроллера представления к контроллеру панели вкладок не работает должным образом?


person lukasMT    schedule 15.07.2014    source источник
comment
Вам нужно представить или нажать контроллер представления, чтобы методы вызывались. Простое добавление представления в качестве подпредставления не сработает.   -  person ZeMoon    schedule 15.07.2014


Ответы (2)


Вам нужно представить или нажать контроллер представления, чтобы методы вызывались. Простое добавление представления в качестве подпредставления не сработает.

В вашем случае вы можете явно вызывать методы viewWillAppear, viewDidAppear.

LoginViewController *vc = [LoginViewController new];
[self.tabBarController addChildViewController:vc];
[vc didMoveToParentViewController:self.tabBarController];
[self.tabBarController.view addSubview:vc.view];

[vc viewWillAppear];
[vc viewDidAppear];
person ZeMoon    schedule 15.07.2014
comment
Спасибо за ответ. Но я думаю, что явно вызывать эти методы не очень хорошее решение. Они должны вызываться автоматически, когда используется сдерживание контроллера представления, верно? Как я уже сказал, когда я использовал свой код в обычном контроллере представления, который является одним из контроллеров представления в контроллере панели вкладок, все работает, как и ожидалось. У меня проблемы только тогда, когда я пытаюсь добавить контроллер дочернего представления непосредственно в контроллер панели вкладок. - person lukasMT; 15.07.2014
comment
Добавление представления viewController непосредственно к другому также не является хорошей реализацией. Когда вы используете такую ​​систему, вам придется использовать подобные обходные пути. Если вы хотите, чтобы методы вызывались сами по себе, вам нужно правильно их представить. - person ZeMoon; 15.07.2014

Это работает!

dispatch_async(dispatch_get_main_queue(), ^{
        [self.tabBarController setSelectedIndex:0];
        [self.tabBarController setSelectedIndex:1];
        [self.tabBarController setSelectedIndex:0];
    });
person SamSol    schedule 17.02.2016