取消注册单元格以在 TableView/CollectionView 中重用有啥意义吗?

Posted

技术标签:

【中文标题】取消注册单元格以在 TableView/CollectionView 中重用有啥意义吗?【英文标题】:Is there any point in unregistering cells for reuse in TableView/CollectionView?取消注册单元格以在 TableView/CollectionView 中重用有什么意义吗? 【发布时间】:2019-02-27 11:59:02 【问题描述】:

我正在制作精简的自定义 TableView 和 CollectionView 子类,它们具有一些生活质量功能,例如自动注册单元以供重用,因此我不必每次都编写该代码以用于其余部分我的生活。

我在运行时生成cellIdentifiers,并注册它们。我想“为什么不同时实现自动注销”,因为显然一个单元格可能会被重新加载而永远不会返回。但我实际上不知道如何..

根据有关为tableView 和collectionView 注册单元的文档,它说如下:

如果你想注销 nib 文件,你可以为 nib 指定 nil 来自指定的重用标识符。

但是,如果我(在我的子类 UICollectionView 中)尝试使用 self.register(nil, forCellWithReuseIdentifier: identifier) 我会收到错误

Ambiguous use of 'register(_:forCellWithReuseIdentifier:)'

我不知道为什么,但我想可能是因为这两个功能:

register(_ cellClass:AnyClass?, forCellWithReuseIdentifier:String)
register(_ nib:UINib?, forCellWithReuseIdentifier:String)

在尝试将nil 作为第一个参数传递时,它们是模棱两可的。

那么 - 文档实际上希望我做什么?我可以将 nil 投给任何东西来帮助它选择其中任何一个吗? 而且 - 注销真的有必要吗?我以前从来没有做过,我在网上找不到太多关于它的信息。。 保持一个单元注册的“成本”是多少?我猜实际上“取消注册”一个单元比让它保持注册会更昂贵,因为取消注册将是一个实际操作 - 但我在这里可能错了..

我知道我可以使用相同的标识符注册不同的单元格,这实际上会取消注册之前的注册,但如果我 100% 确定我永远不会为不同的单元格使用相同的标识符,我是否需要取消注册?

【问题讨论】:

【参考方案1】:

我一生中从未取消注册可重复使用的单元格,所以我不知道这是否值得,但如果你真的想要,你必须更具体地使用你的代码。您是正确的,因为它无法正确解释该方法。

tableView.register(Optional<UINib>.none, forCellReuseIdentifier: "cheese")

将允许编译器确定您正在使用两种方法中的哪一种。

【讨论】:

【参考方案2】:

您可以将nil 向下转换为UINib?,让编译器知道您指的是哪个register

self.register(nil as UINib?, forCellWithReuseIdntifier: identifier)

【讨论】:

以上是关于取消注册单元格以在 TableView/CollectionView 中重用有啥意义吗?的主要内容,如果未能解决你的问题,请参考以下文章

允许触摸表格单元格以取消其他当前触摸

如何通过Java 合并和取消合并 Excel 单元格

导出到excel时如何取消合并s-s-rs中的单元格以尝试排序

UICollectionView 单元格展开动画问题

展开单元格以显示 nib 文件视图

是否可以预加载所有 tableview 单元格以启用平滑滚动?