展开委托不会取消“中间”视图

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 的闭包属性(但忽略指定weakunowned self)?等等。 有问题的视图是一个带有 SearchController 的简单 UTTableViewController。在 viewWillDisappear 上,我将 SearchController 设置为 active = false,searchResultsUpdater = nil 并将其从父视图中删除。没有关闭。我添加的其他代表。我得到的最接近的是为导航控制器分配一个本地引用,但一旦我完成它就会设置回 nil。 【参考方案1】:

发现问题。问题是我在 viewDidLoad 中的这一行:

definesPresentationContext = true

来自文档: 确定应该为 UIModalPresentationCurrentContext 类型的演示文稿呈现哪个父视图控制器的视图。如果没有祖先视图控制器设置此标志,则演示者将是根视图控制器。

因此,中间视图(即“B”)成为根,除非它被“返回”操作解除。

为了避免搜索框在视图 C 上仍然可见一瞬间,我在视图 B 的 prepareForSegue 中添加了searchController.active = false 我从用户选择中获得了选择的值(点击行) .

【讨论】:

以上是关于展开委托不会取消“中间”视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在不显示中间视图的情况下通过多个视图展开

自动选择集合视图的中间可见单元格

滚动视图无法执行委托,但表视图可以

UIScrollView 不会滚动,从未调用过委托方法

在保持 N 级或多级可展开列表视图的折叠/展开状态后,某些子组不会显示

委托不会执行功能