2011-03-24 35 views
9

我已将我的iPhone应用代码中的问题追踪到viewDidAppear方法,但并非总是发射。当您启动应用程序时,事件会按预期启动。但是,如果我使用能够多任务处理并重新打开的手机关闭应用程序,我的viewDidAppear事件不再触发。viewDidAndar在应用进入前景后再次不再发射

我的意见从Nibs加载,我使用viewDidUnload清理(释放和零所有网点)。我的意见嵌套在侧面和标签栏,然后导航控制器。我看起来像事件没有正确连接时,笔尖重新加载。任何想法,我在做什么错/缺少以及如何解决这个问题?

在此先感谢。

UPDATE我不是说应用程序第一次进入前台时事件并未被解雇。我的意思是这个事件再也不会发生。即使在选项卡之间切换或移动导航视图时也是如此。

实施例:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    NSLog(@"viewDidAppear called"); 
} 

此代码被放置在两个视图中,每个不同的选项卡。每次我在标签之间切换“viewDidAppear called”被写入日志。当我关闭并重新打开应用程序并在选项卡之间切换时,不再发生这种情况。其他按钮事件正常启动。

+0

是否还有其他NSLogs出现?我的意思是,这并不是所有NSLogs都没有做任何事情的问题,一旦你开始后续和恢复? – occulus 2011-03-24 11:02:14

+0

你在UIViewControllers方面做了什么异常或复杂的UI设置?例如,您是否在嵌套Apple推荐不嵌套的东西? – occulus 2011-03-24 11:05:44

回答

7

找到它。

尽管对编程并不陌生,但我对iPhone开发并不陌生。在研究这个问题时,我发现不建议手动调用viewWillAppearviewWillDisappear方法。

viewWillDisappear方法辞职任何键盘如果显示,当我的应用程序进入它加载启动画面准备当应用程序重新进入前台的背景(有一些逻辑,我需要做的工作出用户是什么显示在重新启动应用程序,我可以在启动画面下执行此操作)。

由于viewWillDisappear不叫当应用程序进入后台,以确保没有键盘出现在我的启动画面我打电话的applicationDidEnterBackground方法viewWillDisapper。我想这也会取消注册我的活动。

通过将viewWillAppear添加到我的applicationDidEnterForeground方法中,我的事件再次开始触发。经验教训,我会重构这个,所以我不会手动调用这些事件。

感谢您的帮助。

+1

很高兴您对它进行了排序。你应该接受你自己的答案 - 这是允许的,你应该,如果你找到自己的问题的答案。 – occulus 2011-03-25 15:32:28

+1

我强烈建议这个线程的解决方案做这样的特技:http://stackoverflow.com/questions/15864364/viewdidappear-is-not-called-when-opening-app-from-background – Wirsing 2013-12-07 01:12:06

10

顺便说一句,该viewDidUnload方法实在太差了名为顺便说一句 - 这不是一个“反”到viewDidLoad,如果是由于被卸载不处于可见光内存不足的情况,该控制器的看法这只是叫时间。

(原件,没有那么答非所问:)

请参阅我的回答这个类似的问题:

Why does viewWillAppear not get called when an app comes back from the background?

基本上,后您的UIViewController的观点加入到viewDidAppear被调用应用程序的UIWindow图层。背景,然后恢复应用程序不会改变你的观点,所以viewDidAppear不会被调用 - 这是正确的行为,而不是一个错误。查看UIViewController的API文档。

+0

:)它永远不会再被调用。即使我在标签之间切换,推送和弹出视图。一旦我将应用程序最小化并重新打开,此事件再也不会被解雇。 – Magpie 2011-03-24 10:12:16

+1

确保你的所有viewController在viewDidAppear方法中调用了[super viewDidAppear],否则这个消息可能会丢失。 – 2011-03-24 10:38:45