首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用prepareForReuse的正确方法是什么?

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

Stack Overflow用户
提问于 2016-11-23 20:01:34
回答 2查看 34.4K关注 0票数 28

需要帮助了解如何在UIKit中使用UIKit()。文档

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

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

假设我的手机有两个标签,我应该在哪里重置:

  1. label.text
  2. label.numberOfLines
  3. label.isHidden

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-27 15:28:58

tldr:使用prepareForReuse取消可以在下载不同indexPath后完成的现有网络调用。对于所有其他意图和目的,只需使用cellForRow(at:。这与苹果的文档略有冲突。但大多数的神都是这样做的。两处都有单元格配置逻辑是不方便的.

苹果文档说,使用它来重置与内容无关的属性。然而,根据经验,只需在cellForRow中为内容做任何事情就更容易了。唯一真正有意义的时候就是

引用苹果的文档 for prepareForReuse

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

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

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

这意味着,如果您试图设置联系人列表中的配置文件图像,您不应该尝试在nil中设置prepareforreuse图像,您应该正确地在cellForRowAt中设置图像,如果没有找到任何图像,则将其图像设置为nil或默认图像。基本上,cellForRowAt应该同时控制预期的/意外的状态。

因此,基本上以下是,而不是建议的:

代码语言:javascript
复制
override func prepareForReuse() {
    super.prepareForReuse()
    imageView?.image = nil
}

相反,建议采取以下措施:

代码语言:javascript
复制
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
}

此外,建议默认的非内容相关项目如下:

代码语言:javascript
复制
override func prepareForReuse() {
    super.prepareForReuse()
    isHidden = false
    isSelected = false
    isHighlighted = false
    // Remove Subviews Or Layers That Were Added Just For This Cell

}

这样,在运行cellForRowAt时,您可以安全地假设每个单元格的布局是完整的,您只需担心内容。

这是苹果公司的建议。但老实说,我仍然认为,就像马特所说的那样,把所有东西都扔到cellForRowAt里比较容易。干净的代码很重要,但这可能并不能真正帮助您实现这一目标。但是,作为康纳说,唯一必要的时间是,如果您需要取消正在加载的图像。有关更多信息,请参见这里

(如:

代码语言:javascript
复制
override func prepareForReuse() {
    super.prepareForReuse()
    
    imageView.cancelImageRequest() // this should send a message to your download handler and have it cancelled.
    imageView.image = nil
}

另外,在使用RxSwift的特殊情况下:参见这里这里

票数 62
EN

Stack Overflow用户

发布于 2016-11-23 22:02:27

如文档所述,您只需使用上述方法重置与内容无关的属性。至于重订文本/行数.在您设置新值之前,您可以在tableView(_:cellForRowAt:)中执行此操作,如下所示:

代码语言:javascript
复制
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    cell.label.text = "" //reseting the text
    cell.label.text = "New value"
    return cell
    }

您可以采取一种更面向对象的方法,创建一个UITableViewCell子类,并定义一个方法,比如configureCell()来处理所有重新设置的单元格和新脱队列单元的值设置。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40773208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档