UINavigationController不断显示弹出视图

问题描述:

因此,在iOS应用程序中,我使用UINavigationController作为根视图控制器。然后我推了几ViewControllers在栈上,让我们称他们为A,B,C和D.UINavigationController不断显示弹出视图

现在,如果我尝试从栈中弹出d,我有时 *遇到以下问题:调用 后popViewControllerAnimated,最上面的视图控制器(D)的视图仍然存在。但是,如果我显示堆叠,它会正确显示,即显示A-B-C并且D不见了。流行的方法似乎只是做它应该的,但是这个观点并没有反映出这一点。

我尝试了各种其他方法,(popToRootViewController,popToViewController),但行为不会改变(即堆栈打印正确,但D的视图仍然存在)。我在所有看起来有意义的视图上都调用了setNeedsDisplay。

弹出D后,我仍然可以推动并删除其他视图控制器。堆栈反映了这些变化,视图没有。此外,D的观点仍然具有响应性,即它不会被冻结,并且应用程序在后台的行为正确。所有视图都非常简单,没有标签视图或类似内容,只是一些标签和按钮。

我已经阅读了许多关于SO和其他地方关于有类似问题的人的帖子,但没有一个解决方案似乎适合在这里。有谁知道为什么会发生这种情况?

* _我一直无法弄清楚在什么情况下。我首先想到这是因为我推D后很快就会弹出D,但它也偶尔会发生在推送和流行之间有更多时间。

+0

你在使用故事板吗?你有没有设置任何的细节,或者你是否在推动代码? – rdelmar 2014-11-24 20:06:45

+0

对不起,应该提到这一点。我用代码完成所有工作,我不使用故事板。我创建了一个UINavigationController子类的实例,并创建了ViewController子类实例,我将其推送到堆栈并全部以代码形式弹出。 – doubleYou 2014-11-25 13:22:02

+0

这听起来像是你正在做的一切正确,所以这将很难弄清楚,特别是如果你不能可靠地重现问题。我从未在任何项目中看到过类似的东西。 – rdelmar 2014-11-25 15:51:32

这个问题似乎是一个时机。正如我所提到的,(D型)的推动和弹出操作有时确实发生得很快。增加2500毫秒的延迟解决了这个问题。添加500毫秒没有(总是)。由于我不能接受,因此我切换到自定义容器视图控制器,因此没有花费大量时间来确定最小延迟是多少。

正如旁注:从dispatch_async更改为dispatch_sync没有任何影响。延迟似乎是必要的。

感谢大家的帮助。我要关闭这个主题 - 如果有人可以提供更完整的答案,说明为什么事情是这样的,请发布它,然后我将其标记为正确的答案。

只有理由我能想到这可能发生的地方是如果你不在主线程中这样做。如果你是在一些网络通话后做的话,那么确保你要回到主线程。有时,如果你在后台线程上进行UI工作,应用程序不会崩溃,而是会像你所看到的那样行事!

+0

每个推送和弹出(以及所有其他UI相关的东西)都在主线程中完成。我只是检查是否异步执行可能会导致问题,但事实并非如此。 – doubleYou 2014-11-25 13:41:20

+0

然后我猜你的代码片段可能会有所帮助! – Puran 2014-11-25 17:46:33