需要帮助,以了解如何在UIKit中使用prepareForReuse()。该文件说
您只应重置与内容无关的单元格属性,例如Alpha,编辑和选择状态
但是如何重置单个属性属性(例如isHidden)呢?
假设我的单元格有2个标签,我应该在哪里重置:
我的tableView(_:cellForRowAt :)委托具有条件逻辑来隐藏/显示每个单元格的标签。
引用苹果文档中的内容prepareForReuse:
prepareForReuse
出于性能原因,您只应重置 与内容无关 的单元格属性,例如Alpha,编辑和选择状态。
例如,如果选择了一个单元格,则将其设置为未选中,如果将背景色更改为某种颜色,则只需将其重置为 默认 颜色即可。
重用单元格时,表视图的委托人tableView(_:cellForRowAt:) 应始终重置所有内容 。
tableView(_:cellForRowAt:)
这意味着,如果你试图设置您的联系人列表中的个人资料图片,你不应该试图nil图像prepareforreuse,你应该正确设置你的图像中cellForRowAt,如果你没有找到任何图像 ,然后 你设置它的图像nil或默认图片。基本上,cellForRowAt应该同时控制预期/意外状态。
nil
prepareforreuse
cellForRowAt
因此,基本上 不 建议以下内容:
override func prepareForReuse() { super.prepareForReuse() imageView?.image = nil }
相反,建议以下内容:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) cell.imageView?.image = image ?? defaultImage // unexpected situation is also handled. // We could also avoid coalescing the `nil` and just let it stay `nil` cell.label = yourText cell.numberOfLines = yourDesiredNumberOfLines return cell }
另外,建议使用以下与内容无关的默认项目:
override func prepareForReuse() { super.prepareForReuse() isHidden = false isSelected = false isHighlighted = false removeSubviewsOrLayersThatWereAddedJustForThisCell() }
这样,您可以放心地假设在运行时cellForRowAt每个单元格的布局是完整的,而您只需要担心内容。
这是苹果公司建议的方式。但老实说,我仍然认为cellForRowAt像Matt所说的那样将所有内容转储到内部更容易。干净的代码很重要,但这可能并不能真正帮助您实现目标。但是正如Connor所说的,唯一必要的是,如果您需要取消正在加载的图像。更多信息请看这里
即做类似的事情:
override func prepareForReuse() { super.prepareForReuse() imageView.cancelImageRequest() // this should send a message to your download handler and have it cancelled. imageView.image = nil }