UIViewController 在解除先前呈现的模态视图控制器后被释放

Posted

技术标签:

【中文标题】UIViewController 在解除先前呈现的模态视图控制器后被释放【英文标题】:UIViewController getting deallocated after dismissing a previously presented modal viewController 【发布时间】:2015-10-05 20:55:05 【问题描述】:

从最初的 ViewController 中,我在情节提要中使用 ShowDetail segue 和 performSegueWithIdentifier: 方法调用模态地呈现了第二个 ViewController。问题是当我使用 dismissViewControllerAnimated: 方法关闭此模式 ViewController 时,初始 ViewController 被重新实例化,再次调用 viewDidLoad

我尝试使用 Push 转场而不是 Show Detail 并且初始的 ViewController 保持在后台分配。

可能会发生什么?最初的 ViewController 甚至从不调用内存警告方法。

【问题讨论】:

我能问下另一个视图控制器中的“初始”视图控制器是某些视图控制器包含的一部分吗? 初始VC是UINavigationController和UITabbarController中的容器 【参考方案1】:

你尝试过 unwindSegues 吗?

***** 前面的解释很长,如果你想要快速的方法,请跳到 解决方案 *****

首先,如果是ShowDetail,就不是模态视图。试着看看你的情况。 模态序列可以向后传递信息,但比推送的要复杂一些。 如果您以模态方式呈现它,您应该使用 Present Modally 而不是 ShowDetail

模态展示将始终占据堆栈中的顶部视图位置,显示详细信息也是如此,具体取决于您的视图设置方式。例如,如果您在堆栈中有详细视图,IT 将被替换,而不是堆栈顶视图。

尝试选择特定的 segue,我特别推荐模态假设您需要的不仅仅是简单的推送(否则 Show 会解决问题,相当于以前不推荐使用的推送。如果您只需要简单的东西,Show 是方式)

现在我们已经清除了这一点,可能发生的情况是视图正在被删除,因为 Show Detail 替换 视图而不是推送它们,并且它必须再次执行初始化。

***** 解决方案:*****

那么解决方案应该是在替换和重新初始化视图时不要丢失视图,就像dismissViewControllerAnimated: 所做的那样。 如果你使用 unwind segues,但是,视图应该被替换,但由 ARC 保留。

以下链接在网上有关于如何使用它的最佳解释:

What are Unwind segues for and how do you use them?

【讨论】:

我实际上已经做了一些测试,我发现如果我从 Tabbarcontroller 中删除 Initial VC,它应该可以正常工作。但是,即使从 tabbarcontroller 呈现第二个 vc,初始 VC 仍会在 dismissviewcontroller 后重新实例化:

以上是关于UIViewController 在解除先前呈现的模态视图控制器后被释放的主要内容,如果未能解决你的问题,请参考以下文章

当 UIViewController 被解除时重新加载 TableView?

在当前可见之前关闭先前呈现的模态视图控制器

如何以模态方式呈现标准 UIViewController

从UINavigationController中解除具有自定义转换的UIViewController时出现黑屏

将模态呈现的视图控制器关闭到不同的底层视图控制器

如何解除模态转场,然后将转场推入新的视图控制器