展开委托不会取消“中间”视图
Posted
技术标签:
【中文标题】展开委托不会取消“中间”视图【英文标题】:unwind delegate does not deinit a "middle" view 【发布时间】:2016-06-27 09:58:53 【问题描述】:我有一个导航控制器(NC)和三个视图控制器(A、B、C),导航模式如下:
NC->A->B->C
如果我从 A 转到 C 并 'back' B 和 C 的 deinit 方法都会被调用。
如果我使用 Unwind Segue 从 C 转到 A,则不会调用 B deinit。
不清楚原因 - 我的应用程序中有另一个类似的序列,并且无论“返回”或“展开”操作如何,都会调用 deinits。
知道什么会导致 B 在展开操作后“保持活力”吗?
【问题讨论】:
检查该控制器是否有任何强参考循环。有没有重复的计时器?任何非weak
委托引用?任何引用self
的闭包属性(但忽略指定weak
或unowned self
)?等等。
有问题的视图是一个带有 SearchController 的简单 UTTableViewController。在 viewWillDisappear 上,我将 SearchController 设置为 active = false,searchResultsUpdater = nil 并将其从父视图中删除。没有关闭。我添加的其他代表。我得到的最接近的是为导航控制器分配一个本地引用,但一旦我完成它就会设置回 nil。
【参考方案1】:
发现问题。问题是我在 viewDidLoad 中的这一行:
definesPresentationContext = true
来自文档: 确定应该为 UIModalPresentationCurrentContext 类型的演示文稿呈现哪个父视图控制器的视图。如果没有祖先视图控制器设置此标志,则演示者将是根视图控制器。
因此,中间视图(即“B”)成为根,除非它被“返回”操作解除。
为了避免搜索框在视图 C 上仍然可见一瞬间,我在视图 B 的 prepareForSegue 中添加了searchController.active = false
在我从用户选择中获得了选择的值(点击行) .
【讨论】:
以上是关于展开委托不会取消“中间”视图的主要内容,如果未能解决你的问题,请参考以下文章