viewWillAppear, viewDidAppear не вызывается, не запускается - PullRequest
38 голосов
/ 25 августа 2010

(Это и вопрос, и ответ, поскольку потребовалось немало усилий, чтобы найти реальный ответ.)

Симптом: viewWillAppear, viewDidAppear не вызывались в моем UIViewController.

Причина: встраивание UINavigationController или UITabBarController (мой случай) в UIViewController каким-то образом прерывает вызов этих методов.

Решение: вызовите их вручную в UIViewController, который содержит вышеупомянутый UINavigationController / UITabBarController.

Например (при условии, что projectNavigationController ваш UINavigationController):

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

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated];
    [projectNavigationController viewWillDisappear:animated];
}

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated];
    [projectNavigationController viewDidAppear:animated];
}

-(void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated];
    [projectNavigationController viewDidDisappear:animated];
}

В моем случае у меня был внутренний UITabBarController, и я вызвал методы соответственно, и все было решено.

(Атрибуция по решению: http://davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/)

Ответы [ 2 ]

10 голосов
/ 25 августа 2010

Я собираюсь пойти дальше и не согласиться с @ St3fan и использовать UIKit в качестве контрпримера.

Однако мудрость (или ее отсутствие)Встраиваемые контроллеры в целом должны руководствоваться разумными принципами проектирования пользовательского интерфейса.

Самый простой контрпример - это UINavigationControllers, встроенный в UITabBarControllers.Они появляются повсюду.Прямо у меня на голове, приложение iPod на iPhone и контакты в приложении Phone на iPhone.

Мне было любопытно проверить, что они делают с представлениями (добавьте в «суперконтроллера "или к UIWindow. Я был почти уверен, что собираюсь обнаружить, что представления субконтроллера были потомками представлений суперконтроллера в иерархии представлений, что противоречит рекомендации St3fan.

Я запустил очень быстрое приложение для iPhone, подключив все в InterfaceBuilder, чтобы создать приложение на основе UITabBarController с двумя вкладками, первой из которых была UINavigationController с простым ole UIViewController в качестве корневого контроллера и2-я вкладка с простым старым UIViewController, поэтому у меня была 2-я вкладка, чтобы щелкнуть позже.

Посыпать некоторыми операторами NSLog для вывода различных UIView's для контроллеров, которые мы видим так:

tabBarController.view = <UILayoutContainerView: 0x5b0dc80; ...
navigationController.view = <UILayoutContainerView: 0x59469a0; ...
rootViewController.view = <UIView: 0x594bb70; ...
Superview: <UIViewControllerWrapperView: 0x594cc90; ...
Superview: <UINavigationTransitionView: 0x594a420; ...
Superview: <UILayoutContainerView: 0x59469a0; ... // navigationController.view
Superview: <UIViewControllerWrapperView: 0x594b430; ...
Superview: <UITransitionView: 0x5b0e110; ...
Superview: <UILayoutContainerView: 0x5b0dc80; ... // tabBarController.view
Superview: <UIWindow: 0x5942a30; ...

Строки с префиксом «Superview» были результатом перехода по цепочке Superview rootViewController.view's до достижения нуля.

Затем, конечно, быстрый взгляд• стек вызовов в нескольких местах, где viewDidDisappear будет вызываться на корневом контроллере представления.

Во-первых, стек вызовов, когда viewDidDisappear вызывается на корневом контроллере в результате нового контроллеравыталкивается в стек:

-[RootController viewDidDisappear:]
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
...

Во-вторых, стек вызовов при выборе другой вкладки в самом верхнем UITabBarController:

-[RootController viewDidDisappear:]
-[UINavigationController viewDidDisappear:]
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]

Так что во всех случаях кажется, чтоApple решила, что контроллеры должны вызывать различные методы viewDidAppear и т. Д. На своих встроенных субконтроллерах и что представления должны быть встроены аналогичным образом.Я думаю, что ОП ударил по этому гвоздю прямо в голову, если бы мы взяли UIKit дизайн как хороший пример для подражания.

0 голосов
/ 15 января 2012

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

Позже я сделал некоторые изменения макета в вызываемом контроллере представления и увидел, что viewDidAppear не вызывается, как описано выше.Выходные данные отладки ссылались на «вложенные операции push» или что-то в этом роде, и, поскольку у меня был большой комментарий к моей ручной операции push

#warning I SHOULD NOT HAVE TO DO THIS!!

, я остановил код segue и,Конечно же, сейчас работает IB, и это была моя ручная операция в коде выбора ячейки таблицы, которая путала вызовы делегатов в вызываемом представлении.Я удалил ручной код, и все снова в порядке.

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

...