【问题标题】:viewDidAppear: not firing under certain conditions?viewDidAppear:在某些条件下不触发?
【发布时间】:2010-01-27 05:10:58
【问题描述】:

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

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

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

  1. [窗口 makeKeyAndVisible]
  2. [窗口addSubView:a.view];
  3. 创建视图控制器“d”
  4. 使用 rootviewcontroller "d" 创建一个 navigationController "e"
  5. 调用 [c addSubView:e.view]

问题/问题:当我执行上述所有操作时,viewDidAppear: 不会为“d”触发。 (但 viewDidLoad 正在触发。)我如何找出它不触发的原因,并修复它以使其触发?

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

【问题讨论】:

    标签: iphone cocoa-touch uiviewcontroller


    【解决方案1】:

    通常,当您手动修改视图层次结构时,您不会得到-viewWillAppear:-viewDidAppear 等;它们由各种 SDK 方法调用,例如 -pushViewController:animated:-presentModalViewController:animated: 以及在选择选项卡时由 UITabBarController 调用。

    当您自己将视图添加到层​​次结构时,它可能会或可能不会出现在屏幕上或即将出现在屏幕上; -addSubview: 方法不对您的意图做出任何假设。只需在添加视图时自己调用它们即可。

    【讨论】:

    • 将此标记为答案,因为解释是有道理的。仍然会出现一些动画崩溃(没有动画就不会崩溃),但可能是由于我的代码中存在其他一些不相关的奇怪现象。
    【解决方案2】:

    首先要注意的是,viewDidAppear 是 UIViewController 的方法,而不是 UIView 的方法,它真的和视图无关。

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

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

    正如@Noah 提到的,当您使用 pushViewController 时,您会收到这些消息,因为该方法会导致推送的视图控制器成为“活动”的 UIViewController。

    我对你的建议是,如果你为作为子视图的视图创建控制器,而不是 UIViewController 而是 NSObject 的子类,它会降低你的混淆程度,因为你不会期望调用你的 UIViewController 方法,而它们不会无论如何。

    【讨论】:

    • 我在这里遇到了一个问题,在 iOS5 设备上调用 viewDidAppear 而不是 iOS4 设备。使用导航控制器,我从控制器 A 以非常正常的方式推动控制器 B。我不确定这是否有意义,但我还在控制器 A 中存储了对控制器 B 的引用(通常我只是让导航控制器在控制器上保持标签)。我依靠控制器 B 中 viewDidAppear 中的一些代码在它显示后立即触发,但是是的,它至少在 iOS 4.3 中中断了。我停止使用 viewDidAppear,只是在控制器 B 中创建了一个 -(void)start;,以便在推送后调用。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      相关资源
      最近更新 更多