viewDidAppear:在某些条件下不触发?

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案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];

【讨论】:

以上是关于viewDidAppear:在某些条件下不触发?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 viewDidAppear 没有被触发?

应用程序进入前台后 viewDidAppear 不再触发

viewDidAppear 只在某些情况下被调用?

为啥 selectAnnotation 在这种情况下不起作用?

MySQL触发器在某些条件下防止INSERT

是否可以在不使用继承的情况下在viewDidAppear上调用某些代码