如何保护集合视图子视图不被重用

Posted

技术标签:

【中文标题】如何保护集合视图子视图不被重用【英文标题】:How to protect a collection view subview from reuse 【发布时间】:2014-07-05 17:09:25 【问题描述】:

UICollectionView 允许您为单元格项目、补充视图和装饰视图定义自定义视图。这些都必须是 UICollectionReusableView 的子类,以便集合视图可以在它们离开屏幕时处理它们以节省资源。

但是,我想添加一个视图,它与集合视图的其余内容一起滚动,但永远不会被丢弃。那是因为这个视图包含一些我不想在视图控制器中管理的复杂状态(长话短说)。这个视图有点像装饰视图,它不依赖于 UICollectionViewDatasource 提供的数据。

那么什么是有效的方法呢?

选项 1. 有没有办法让它成为装饰视图,但以某种方式标记它以便集合视图在它离开屏幕时永远不会丢弃它?

选项 2。如果不是,最好的选择是将其作为普通子视图添加到集合视图中,利用集合视图作为滚动视图的功能?集合视图是否明确支持这一点,或者我是否有手动添加子视图会破坏集合视图自己的布局管理的风险?

选项 3。如果集合视图不支持这一点,那么对于这种情况是否还有另一种传统的最佳实践?例如,我可以将装饰类视图作为同级添加到集合视图中,然后尝试挂钩到集合视图的平移手势识别器,但这感觉很笨拙和脆弱。

自从

【问题讨论】:

尝试查看collectionViewHeaderView 或页脚视图。 这些是补充视图,因此它们有可能被集合视图自行销毁。这是我要避免的。 您可以继续关注blog.radi.ws/post/32905838158/… 或避免麻烦,只需将子视图添加到集合视图的超级视图。 是的,似乎我需要将子视图添加到集合视图中(所以我控制它的初始化和生命周期),但还需要实现自定义布局(因此集合视图布置了它的内容偏移量,所以它不会崩溃到我手动添加的子视图中)。 【参考方案1】:

这个视图包含一些我不想在视图控制器中管理的复杂状态

这是问题的根源。使用视图来存储状态从来都不是一个好主意。您说您正在寻找“最佳实践”,但事实是,最佳实践是将您的状态管理代码移出视图并放入模型对象中。

模型和视图之间的分离很大程度上是出于您发现的原因——视图与模型类具有不同的生命周期、关系和职责。任何尝试将视图转换为模型类的问题解决方案都可能会给您带来脆弱、笨拙的感觉。

【讨论】:

我知道这一点。这就是为什么我说那部分是一个“长篇故事”。尽管如此,我仍然想知道是否有一种方法可以添加一个子视图来跟踪 UICollectionView 的内容,而无需将其作为可重用单元进行管理。这是内置的 UITableView 通过 tableHeaderView 和 tableFooterView 提供的,所以也许有有效的用例。【参考方案2】:

我的问题似乎与How to add HeaderView in UICollectionView like UITableView's tableHeaderView 重复(至少在页眉或页脚视图的可能特殊情况下)。

这个答案表明,一种解决方案是使用UICollectionView 上的contentInset 属性为页眉或页脚创建空间,然后手动将它们作为子视图添加到该空间中。

另一个对我有用的解决方案是将 UICollectionViewFlowLayout 子类化以创建额外的空间,而不是使用 contentInset

但是,使用contentInset 显然更简单。我能看到的唯一区别是基于插图的方法意味着集合视图的contentSize 仅反映它管理的单元格,而不是手动添加的页眉和页脚视图。我认为这没有任何问题。

【讨论】:

以上是关于如何保护集合视图子视图不被重用的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 AWS CloudFormation 堆栈不被删除?

MySQL视图

17.视图--SQL

iOS - 如何在 tableView 单元格顶部添加子视图而不被前一个单元格覆盖

视图和存储过程

Mysql基础知识:视图