使用prepareForReuse的正确方法是什么?
需要帮助,以了解如何在UIKit中使用prepareForReuse()。该文件说
您只应重置与内容无关的单元格属性,例如Alpha,编辑和选择状态
但是如何重置单个属性属性(例如isHidden)呢?
假设我的单元格有2个标签,我应该在哪里重置:
- 标签文本
- label.numberOfLines
- 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