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?