我正在制作具有一些生活质量特性的瘦自定义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
作为第一个参数时,它们是模棱两可的。
那么 - 文档实际上期望我做什么?我可以把零点什么来帮助它选择其中任何一个吗?并且 - 取消注册真的有必要吗?我以前从来没有这样做过,我在网上找不到太多关于它的信息。保持一个细胞注册需要多少“费用”?我猜测实际上“取消注册”一个单元格要比注册它更加昂贵,因为取消注册将是一个实际的操作 - 但我可能在这里错了..
我知道我可以使用相同的标识符注册不同的单元格,这实际上会取消注册以前的注册,但如果我100%确定我永远不会对不同的单元格使用相同的标识符,我是否需要取消注册?
我从来没有在我的生活中取消注册可重复使用的单元格,所以我不知道它是否值得,但如果你真的想要,你必须更加具体地使用你的代码。你是正确的,它无法正确解释方法。
tableView.register(Optional<UINib>.none, forCellReuseIdentifier: "cheese")
将允许编译器计算出您正在使用的两种方法中的哪一种。
您可以将nil
转发到UINib?
,让编译器知道您指的是哪个register
:
self.register(nil as UINib?, forCellWithReuseIdntifier: identifier)