【问题标题】:UINavigationController keeps displaying popped viewUINavigationController 不断显示弹出视图
【发布时间】:2014-11-24 19:16:37
【问题描述】:

所以在 iOS 应用程序中,我使用 UINavigationController 作为根视图控制器。然后我将几个 ViewController 压入堆栈,我们称它们为 A、B、C 和 D。

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

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

弹出 D 后,我仍然可以推送和移除其他视图控制器。堆栈反映了这些变化,视图没有。此外,D 的视图保持响应,即它没有被冻结,并且应用程序在后台运行正常。所有视图都非常简单,没有标签视图之类的,只有几个标签和按钮。

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

*_ 我无法弄清楚究竟是在哪种情况下。我一开始以为是因为我推后很快就弹出了D,但是当推和弹出之间有更多时间时,偶尔也会发生这种情况。

【问题讨论】:

  • 您在使用情节提要吗?您是否设置了任何 segues,或者您是否正在推送和弹出代码?
  • 对不起,应该提到这一点。我在代码中做这一切,我不使用故事板。我创建了一个 UINavigationController 子类的实例,并创建了 ViewController 子类实例,我将它们推送到堆栈并弹出它们,所有这些都在代码中。
  • 听起来你做的一切都是正确的,所以这很难弄清楚,特别是如果你不能可靠地重现问题。我从来没有在我的任何项目中看到过这样的事情。

标签: ios objective-c iphone uinavigationcontroller


【解决方案1】:

我能想到这可能发生在哪里的唯一原因是如果你没有在主线程中这样做。如果您是在一些网络调用之后执行此操作,那么请确保您要返回主线程。有时,如果您在后台线程上执行 UI 工作,应用程序不会崩溃,而是会像您所看到的那样运行!

【讨论】:

  • 每次推送和弹出(以及所有其他与 UI 相关的内容)都在主线程中完成。我刚刚检查了异步执行此操作是否会以某种方式导致问题,但事实并非如此。
【解决方案2】:

问题似乎是时间问题之一。正如我所提到的,(D 的)push 和 pop 操作有时会一个接一个地发生。添加 2500 毫秒的延迟解决了这个问题。添加 500 毫秒并没有(总是)。由于我都无法接受,因此我切换到了自定义容器视图控制器,因此没有花很多时间来确定最小延迟是多少。

正如旁注:从 dispatch_async 更改为 dispatch_sync 没有任何效果。无论哪种方式,延迟似乎都是必要的。

感谢大家的帮助。我将关闭此线程 - 如果有人可以提供更完整的答案来说明事情为何如此,请发布它,然后我会将其标记为正确答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多