取消注册单元格以在 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 中重用有啥意义吗?的主要内容,如果未能解决你的问题,请参考以下文章