viewDidAppear: не стреляет при определенных условиях? - PullRequest
5 голосов
/ 27 января 2010

У меня в приложении есть следующие пункты:

  • как обычно: владелец файла, окно первого респондента, делегат
  • Просмотр контроллера "а"
    • Просмотр "b"
      • UIScrollView "c"
      • некоторые другие вещи в "b"

В приложении AppDelegateDidFinishLaunching я делаю это:

  1. [window makeKeyAndVisible]
  2. [окно addSubView: a.view];
  3. создать контроллер вида "d"
  4. создать контроллер навигации «e» с помощью rootviewcontroller «d»
  5. invoke [c addSubView: e.view]

Вопрос / проблема: когда я делаю все вышеперечисленное, viewDidAppear: не запускается для «d». (но viewDidLoad стреляет.) Как я могу узнать, почему он не стреляет, и исправить его так, чтобы он срабатывал?

(Почему я хочу использовать viewDidAppear: вышеупомянутое включает в себя некоторые связанные анимации, и viewDidAppear выглядит как хорошее место для контроллера представления, чтобы узнать, когда его представление было загружено и анимировано, поэтому он может запускать последующие анимации.)

Ответы [ 3 ]

10 голосов
/ 27 января 2010

Обычно, когда вы вручную завинчиваете иерархию представления, вы не получите -viewWillAppear:, -viewDidAppear и т. Д .; они вызываются различными методами SDK, такими как -pushViewController:animated:, -presentModalViewController:animated: и UITabBarController, когда выбирается вкладка.

Когда вы добавляете представление в иерархию самостоятельно, оно может отображаться или не отображаться на экране; -addSubview: метод не делает никаких предположений о ваших намерениях. Просто позвоните им самим, когда добавите представление.

3 голосов
/ 27 января 2010

Первое, что вам следует знать, это то, что viewDidAppear - это метод UIViewController, а не UIView, он действительно не имеет ничего общего с представлениями.

Во-вторых, одновременно может быть только один «активный» UIViewController.

Когда вы добавляете представление «a» в окно, оно становится активным UIViewController, и только «a» получит сообщение viewDidAppear, в то время как «e» фактически не получит никаких методов, связанных с UIViewContoller (viewDidAppear, viewWillAppear и т. Д.). )

Как упомянуто @Noah, когда вы используете pushViewController, вы получите эти сообщения, потому что метод заставляет контроллер push-view стать "активным" UIViewController.

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

1 голос
/ 10 ноября 2013

У меня была похожая проблема, когда я устанавливал делегат моего контроллера навигации. Поэтому в моих методах UINavigationControllerDelegate я сделал что-то вроде этого:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    //do something here
    [viewController viewWillAppear:animated];
}

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [viewController viewDidAppear:animated];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...