viewDidAppear:在某些条件下不开火?

时间:2010-01-27 05:10:58

标签: iphone cocoa-touch uiviewcontroller

我的app nib中有以下项目:

  • 通常:文件的所有者,第一响应者窗口,代理
  • 查看控制器“a”
    • 查看“b”
      • UIScrollView“c”
      • “b”
      • 中的其他一些内容

在我的AppDelegate applicationDidFinishLaunching中,我这样做:

  1. [window makeKeyAndVisible]
  2. [window addSubView:a.view];
  3. 创建一个视图控制器“d”
  4. 使用rootviewcontroller“d”
  5. 创建navigationController“e”
  6. 调用[c addSubView:e.view]
  7. 问题/问题:当我执行以上所有操作时,viewDidAppear:不会触发“d”。 (但是viewDidLoad正在开火。)我如何找出它没有射击的原因,并修复它以便射击?

    (为什么我要使用viewDidAppear:上面涉及一些链式动画,viewDidAppear看起来像是视图控制器知道何时加载和动画视图的好地方,因此它可以触发后续动画。)

3 个答案:

答案 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];
}