当前位置: 首页 > 面试题库 >

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

姬振
2023-03-14
问题内容

需要帮助,以了解如何在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
}


 类似资料:
  • 问题内容: 即使在使用Java Swing一年以上之后,对我来说,它仍然像魔术一样。如何正确使用BufferStrategy,尤其是方法? 我想添加一个JFrame和一个Canvas,然后进行绘制。我还希望能够调整()画布的大小。每次我调整Canvas的大小时,似乎都会被浪费掉,或者变得毫无用处,因为在上使用并没有真正做任何事情。另外,它具有怪异的不确定性行为,我不知道如何正确同步它。 这就是我的

  • 问题内容: 我想在Linux上使用该机制。我希望我的应用程序知道何时更改了文件。能否请您提供给我一个示例,该怎么做? 问题答案: 文档(来自具有inotify的Monitor文件系统活动) 在C API 提供了三个系统调用来构建各种文件系统监视器: 在内核中创建子系统的实例,并在成功和失败时返回文件描述符。与其他系统调用一样,如果失败,请检查诊断。 顾名思义,它增加了一块 手表 。每个监视都必须提

  • 一段时间以来,我一直试图将我的tableview工作作为一种电子表格,通过背景线程进行更新,当单元格更新时,它会亮起几秒钟(更改样式),然后返回到原始样式。我已经知道,我不能直接在表格单元格中存储和设置样式,我需要某种支持类来保存这些数据。但是tableview“重用”单元格(使用相同的单元格处理不同的数据)的行为真的很奇怪。当所有单元格都适合屏幕时,它对我来说完美无瑕,但一旦我放置大约100个单

  • 那么,回到问题上来,鉴于微软建议不要在新的开发中使用WebRequest而是使用只提供异步API的HttpClient,我该怎么办呢? 这是我正在做的一些伪代码... 如何实现ProcessStuff()?

  • 问题内容: 我正在与我的CompSci教授交谈,他建议将所有String 方法编写为: 而不是: 这两行都可以编译,但是我想知道第一种方法的好处是什么?我一直都是后一种方式。错了吗 什么是普通/常规? 问题答案: 第一种方法确保执行比较时不会收到 NullPointerException 。当您尝试在不存在的对象上调用方法时,抛出(发生)此异常。 以下是一些相关的切线:仔细阅读风险自负 不过要注意

  • 问题内容: 我在一些帖子中看到人们在编写动态HTML时不喜欢在javascript中使用。 为什么是这样?什么是 正确的 方法是什么? 问题答案: 仅在最初解析页面和创建DOM时才起作用。浏览器到达结束标记并且DOM准备就绪后,就不能再使用了。 我不会说使用是正确的还是不正确的,这仅取决于您的情况。在某些情况下,您只需要完成任务即可。查看如何将Google Analytics(分析)注入大多数网站