Ios UINavigationController保持显示弹出视图

Ios UINavigationController保持显示弹出视图,ios,objective-c,iphone,uinavigationcontroller,Ios,Objective C,Iphone,Uinavigationcontroller,因此,在iOS应用程序中,我使用UINavigationController作为根视图控制器。然后我在堆栈上推几个ViewController,让我们称它们为a、B、C和D 现在,如果我尝试从堆栈中弹出D,我有时会遇到以下问题: 调用popViewControllerAnimated后,最顶层视图控制器(D)的视图将保留。但是,如果我显示堆栈,它将正确显示,即A-B-C显示,D消失。pop方法似乎正是它应该做的,但视图并没有反映这一点 我尝试了各种其他方法(popToRootViewContro

因此,在iOS应用程序中,我使用UINavigationController作为根视图控制器。然后我在堆栈上推几个ViewController,让我们称它们为a、B、C和D

现在,如果我尝试从堆栈中弹出D,我有时会遇到以下问题: 调用popViewControllerAnimated后,最顶层视图控制器(D)的视图将保留。但是,如果我显示堆栈,它将正确显示,即A-B-C显示,D消失。pop方法似乎正是它应该做的,但视图并没有反映这一点

我尝试了各种其他方法(popToRootViewController、popToViewController),但行为没有改变(即堆栈打印正确,但D的视图保持不变)。我已经调用了setNeedsDisplay来显示所有似乎有意义的视图

在弹出D之后,我仍然可以按下并移除其他视图控制器。堆栈会反映这些更改,而视图不会。此外,D的视图保持响应,即它没有被冻结,并且应用程序在后台的行为正确。所有视图都非常简单,没有选项卡式视图等,只有几个标签和按钮

我在SO和其他地方读过很多关于有类似问题的人的帖子,但没有一个解决方案适合这里。有人知道为什么会这样吗


*_我还没有弄清楚到底是在什么情况下。我最初认为这是因为我在推D之后很快就会弹出D,但当推和弹出之间的时间较长时,偶尔也会发生这种情况。

我能想到的唯一原因是如果你没有在主线程中这样做。如果您是在一些网络呼叫之后进行的,那么一定要确保返回到主线程。有时候,若你们在后台线程上做UI工作,应用程序不会崩溃,而是会像你们看到的那个样运行

问题似乎在于时机。正如我所提到的,推送和弹出操作(D)有时会很快地一个接一个地发生。增加2500毫秒的延迟解决了这个问题。添加500毫秒并没有(总是)。由于这两种方法都不被我接受,我切换到一个定制的容器视图控制器,因此没有花太多时间来计算最小延迟是多少

正如旁注:从dispatch\u async更改为dispatch\u sync没有任何效果。不管怎样,拖延似乎都是必要的


谢谢大家的帮助。我将结束此帖子-如果有人能提供一个更完整的答案,说明为什么事情是这样的,请发布它,然后我将其标记为正确答案。

您使用的是故事板吗?您是否设置了任何segues,或者正在推送和弹出代码?对不起,应该提到这一点。我是用代码做的,我不使用故事板。我创建了一个UINavigationController子类的实例,并创建了ViewController子类实例,我将这些实例推送到堆栈并弹出它们,所有这些都是代码。听起来好像你做的每件事都是正确的,所以这很难理解,特别是如果你不能可靠地重现问题的话。我从来没有在我的任何项目中见过这样的事情。每次推送和弹出(以及所有其他与UI相关的东西)都是在主线程中完成的。我只是检查了异步执行此操作是否会导致问题,但事实并非如此。