在展示视图控制器被释放后,关闭展示的视图控制器

Posted

技术标签:

【中文标题】在展示视图控制器被释放后,关闭展示的视图控制器【英文标题】:Dismiss presented view controller, after the presenting view controller has been released 【发布时间】:2017-02-21 08:39:38 【问题描述】:

我正在编写一些不是我编写的旧代码,而且它的架构确实不太好......

情况是视图控制器以模态方式呈现自定义视图控制器,但是每 30 秒重新创建呈现视图控制器。

这里的问题是,如果模态在发生这种情况时显示在屏幕上,那么任何消除它的努力都会导致奇怪的行为(例如白屏)。

我已尝试在新重新创建的控制器上调用 [self.presentedViewController dismissViewControllerAnimated];,但 presentedViewController 与您预期的一样为零。

我还尝试保持对模态视图控制器的弱引用,然后在重新加载呈现的 VC 时,将此值设置为旧 VC 的值。这让我可以调用self.customModalVC dismissViewControllerAnimated];,但这会导致前面提到的白屏,可能是因为它显示的 VC 不再在堆栈中?

任何和所有建议都表示赞赏。

【问题讨论】:

为什么每 30 秒重新创建一次?这对我来说听起来有点奇怪。我现在还看到了在不保留对它的引用的情况下保持此模态视图呈现的方法,这可能会导致内存问题,因为您需要保留对持有它的 viewController 的引用。所以你最好的选择听起来像是重构/改变它。 这是由于网络调用,我同意这是一种完全愚蠢的做法。不会是我的方法。看起来我除了重构之外真的没有太多选择...... PM 会喜欢 4h 票去 3d 票哈哈。 是的,这听起来很有趣。 【参考方案1】:

尝试将导航控制器传递给新呈现的 ViewController:

    presentedVC.navigation = self.navigationController

将此添加到新创建的以关闭

    self.dismiss(animated: false)  
                _ = self.navigation?.popViewController(animated: true)
            

【讨论】:

navigationController 的属性 UIViewController 是只读的。 此外,模态展示在导航堆栈中是互斥的,因此没有“弹出”和“推送”。

以上是关于在展示视图控制器被释放后,关闭展示的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

关闭模态视图控制器后自动释放崩溃

在当前视图控制器下显示新的视图控制器

从 SKScene 呈现后无法关闭视图控制器

iOS:关闭时视图控制器未释放

为啥我在关闭视图控制器后无法显示我的 Facebook 插页式广告?

目标c-关闭集合视图控制器后未释放常驻内存和脏内存