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

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

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

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

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

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

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

回答:

引用苹果文档中的内容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

}


以上是 使用prepareForReuse的正确方法是什么? 的全部内容, 来源链接: utcz.com/qa/424659.html

回到顶部