需要帮助了解如何在 UIKit 中使用 prepareForReuse()。文件说_
您应该只重置与内容无关的单元格属性,例如 alpha、编辑和选择状态
但是如何重置单个属性属性,例如 isHidden?
假设我的单元格有 2 个标签,我应该在哪里重置:
- 标签.文本
- label.numberOfLines
- label.isHidden
我的 tableView(_:cellForRowAt:) 委托具有条件逻辑来隐藏/显示每个单元格的标签。
需要帮助了解如何在 UIKit 中使用 prepareForReuse()。文件说_
您应该只重置与内容无关的单元格属性,例如 alpha、编辑和选择状态
但是如何重置单个属性属性,例如 isHidden?
假设我的单元格有 2 个标签,我应该在哪里重置:
我的 tableView(_:cellForRowAt:) 委托具有条件逻辑来隐藏/显示每个单元格的标签。
tldr:用于prepareForReuse
取消现有的网络调用,这些调用可以在下载不同的 indexPath 后完成。对于所有其他意图和目的,只需使用cellForRow(at:
. 这略微违反了 Apple 文档。但这就是大多数开发人员做事的方式。在两个地方都有单元配置逻辑很不方便......
苹果文档说用它来重置与内容无关的属性。但是,根据经验,只为内容而不是在内部做所有事情可能会更容易。它真正有意义的唯一时间是cellForRow
引用Apple 的文档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
// Remove Subviews Or Layers That Were Added Just For This Cell
}
这样,您可以在运行时安全地假设cellForRowAt
每个单元格的布局都是完整的,您只需要担心内容。
这是Apple建议的方式。但老实说,我仍然认为cellForRowAt
像马特所说的那样把所有东西都倒在里面更容易。干净的代码很重要,但这可能并不能真正帮助您实现这一目标。但正如康纳所说,唯一需要的是,如果您需要取消正在加载的图像。更多请看这里
即做类似的事情:
override func prepareForReuse() {
super.prepareForReuse()
imageView.cancelImageRequest() // this should send a message to your download handler and have it cancelled.
imageView.image = nil
}
如文档所述,您只需使用上述方法来重置与内容无关的属性。至于重置标签的文本/行数....,您可以在设置新值之前从 tableView(_:cellForRowAt:) 中执行此操作,如下所示:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell.label.text = "" //reseting the text
cell.label.text = "New value"
return cell
}
或者
您可以采用更面向对象的方法并创建 UITableViewCell 的子类并定义一个方法说 configureCell() 来处理新出列单元格的所有重置和值设置。