我的app nib中有以下项目:
在我的AppDelegate applicationDidFinishLaunching中,我这样做:
问题/问题:当我执行以上所有操作时,viewDidAppear:不会触发“d”。 (但是viewDidLoad正在开火。)我如何找出它没有射击的原因,并修复它以便射击?
(为什么我要使用viewDidAppear:上面涉及一些链式动画,viewDidAppear看起来像是视图控制器知道何时加载和动画视图的好地方,因此它可以触发后续动画。)
答案 0 :(得分:10)
通常,当您手动拧入视图层次结构时,您将无法获得-viewWillAppear:
,-viewDidAppear
等;当选中标签时,它们会被各种SDK方法调用,例如-pushViewController:animated:
,-presentModalViewController:animated:
和UITabBarController
。
当您自己向层次结构添加视图时,它可能在屏幕上,也可能不在屏幕上; -addSubview:
方法不会对您的意图做出任何假设。只需在添加视图时自己打电话给他们。
答案 1 :(得分:3)
你要注意的第一件事是viewDidAppear是UIViewController的一个方法而不是UIView的方法,它实际上与视图无关。
第二件事是,一次只能有一个“活动”UIViewController。
当你向窗口添加“a”的视图时,它变为活动的UIViewController,只有“a”将收到viewDidAppear消息,而“e”实际上不会获得任何与UIViewContoller相关的方法(viewDidAppear,viewWillAppear等)。 )
正如@Noah在使用pushViewController时提到的那样,您将收到这些消息,因为该方法会使推送的视图Controller成为“活动的”UIViewController。
我的建议是,如果为子视图的视图创建控制器不是UIViewController的子类而是NSObject的子类,那么它将减少你的混乱程度,因为你不希望得到他们不会调用你的UIViewController方法反正。
答案 2 :(得分:1)
当我设置导航控制器的委托时,我遇到了类似的问题。所以在我的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];
}