代码之家  ›  专栏  ›  技术社区  ›  Jaanus

视图显示:在特定条件下不开火?

  •  5
  • Jaanus  · 技术社区  · 15 年前

    我的应用程序NIB中有以下项目:

    • 通常:文件的所有者、第一响应者窗口、委托
    • 视图控制器“A”
      • 视图“B”
        • ui滚动视图“c”
        • “B”中的一些其他内容

    在AppDelegate应用程序DidFinishLaunching中,我执行以下操作:

    1. [窗口生成键和可见]
    2. [窗口addSubview:a.view];
    3. 创建视图控制器“D”
    4. 使用rootviewcontroller“d”创建导航控制器“e”
    5. 调用[C AddSubView:E.View]

    问题/问题:当我执行以上所有操作时,viewdidAppear:不是为“d”开火。(但VIEWDIDLOAD正在点火。)我如何找出它为什么不点火,并修复它以便点火?

    (我为什么要使用viewdidappear:上面涉及到一些链接动画,viewdidappear看起来是视图控制器了解其视图何时被加载和设置动画的好地方,因此它可以触发后续动画。)

    3 回复  |  直到 11 年前
        1
  •  10
  •   Noah Witherspoon    15 年前

    通常,当您手动处理视图层次时,您不会得到 -viewWillAppear: , -viewDidAppear 等等;它们被各种sdk方法调用,比如 -pushViewController:animated: , -presentModalViewController:animated: 和通过 UITabBarController 当一个标签被选中时。

    当您自己将视图添加到层次结构中时,它可能在屏幕上,也可能不在屏幕上,也可能不在屏幕上。 -addSubview: 方法不会对您的意图做出任何假设。当你添加视图时,你自己给他们打电话。

        2
  •  3
  •   Ron Srebro    15 年前

    您应该注意的第一件事是,viewdidAppear是uiviewController的一种方法,而不是uiview的一种方法,它实际上与视图无关。

    第二件事是一次只能有一个“活动”的uiviewcontroller。

    当您将“a”的视图添加到窗口中时,它将成为活动的uiviewController,只有“a”将收到viewDidAppear消息,而“e”实际上不会获得任何uiviewController相关的方法(viewDidAppear、viewWillAppear等)。

    正如@noah在使用pushviewcontroller时提到的那样,您将收到这些消息,因为该方法会导致推送的视图控制器成为“活动”的uiviewcontroller。

    我对您的建议是,如果您为子视图的视图创建控制器,而不是子类uiviewcontroller,而是nsObject,那么它将减少您的混淆级别,因为您不会期望调用uiviewcontroller方法,而这些方法无论如何都不会调用。

        3
  •  1
  •   Raunak    11 年前

    当我设置导航控制器的代理时,也遇到了类似的问题。所以在我的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];
    }