一尘不染

使用prepareForReuse的正确方法是什么?

swift

需要帮助,以了解如何在UIKit中使用prepareForReuse()。该文件

您只应重置与内容无关的单元格属性,例如Alpha,编辑和选择状态

但是如何重置单个属性属性(例如isHidden)呢?

假设我的单元格有2个标签,我应该在哪里重置:

  1. 标签文本
  2. label.numberOfLines
  3. label.isHidden

我的tableView(_:cellForRowAt :)委托具有条件逻辑来隐藏/显示每个单元格的标签。


阅读 764

收藏
2020-07-07

共1个答案

一尘不染

引用苹果文档中的内容prepareForReuse

出于性能原因,您只应重​​置 与内容无关 的单元格属性,例如Alpha,编辑和选择状态。

例如,如果选择了一个单元格,则将其设置为未选中,如果将背景色更改为某种颜色,则只需将其重置为 默认 颜色即可。

重用单元格时,表视图的委托人tableView(_:cellForRowAt:) 应始终重置所有内容

这意味着,如果你试图设置您的联系人列表中的个人资料图片,你不应该试图nil图像prepareforreuse,你应该正确设置你的图像中cellForRowAt,如果你没有找到任何图像
,然后 你设置它的图像nil或默认图片。基本上,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
}

2020-07-07