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:在某些条件下不触发?的主要内容,如果未能解决你的问题,请参考以下文章