gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:22:16 32 4
gpt4 key购买 nike

在了解如何在 UIKit 中使用 prepareForReuse() 方面需要帮助。documentation

you should only reset attributes of the cell that are not related to content, for example, alpha, editing, and selection state

但是如何重置单个属性属性,例如 isHidden?

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

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

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

最佳答案

tldr:使用 prepareForReuse 取消现有的网络调用,这些调用可以在下载不同的 indexPath 后完成。对于所有其他意图和目的,只需使用 cellForRow(at:。这与 Apple 文档略有不同。但这就是大多数开发人员做事的方式。在两个地方都有单元格配置逻辑是不方便的......


Apple 文档说使用它来重置内容相关的属性。然而,根据经验,只在 cellForRow 中为内容做所有事情可能更容易,而不是。唯一真正有意义的时间是

引自Apple's docs对于 prepareForReuse:

For performance reasons, you should only reset attributes of the cellthat are not related to content, for example, alpha, editing, andselection state.

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

The table view's delegate in tableView(_:cellForRowAt:) shouldalways reset all content when reusing a cell.

这意味着如果您尝试设置联系人列表的个人资料图片,您不应该尝试在prepareforreusenil 图片,您应该正确地设置您的图片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 时每个单元格的布局都是完整的,您只需担心内容。

这是苹果推荐的方式。但老实说,我仍然认为将所有内容转储到 cellForRowAt 中会更容易,就像 Matt 所说的那样。干净的代码很重要,但这可能并不能真正帮助您实现这一点。但是作为Connor said唯一需要的时候是,如果您需要取消正在加载的图像。有关更多信息,请参阅 here

即做类似的事情:

override func prepareForReuse() {
super.prepareForReuse()

imageView.cancelImageRequest() // this should send a message to your download handler and have it cancelled.
imageView.image = nil
}

此外,在使用 RxSwift 的特殊情况下:参见 herehere

关于ios - prepareForReuse 的正确使用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773208/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com