【问题标题】:UITableView shuffling when scrolling滚动时 UITableView 洗牌
【发布时间】:2017-07-10 16:41:38
【问题描述】:

我有一个 UITableView 设置几乎可以正常工作,但是如果你快速向上或向下滚动,它会将单元格打乱。我设置标签以反映索引路径,甚至当它开始时

[0,0] [0,1] [0,2] [0,3] [0,4] [0,5] [0,6]

快速上下滑动几次后,单元格看起来像这样

[0,1] [0,6] [0,2] [0,3] [0,4] [0,5] [0,0] [0,1]

我的代码类似如下

import UIKit

class TableViewController : UITableViewController {

    var dates: [Date]?

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dates?.count ?? 0
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: tableViewCell.storyboardID, for: indexPath) as?  tableViewCell else { fatalError() }

        let date = dates?[indexPath.row]
        cell.date = date
        cell.delegate = self
        cell.cellIndex = indexPath

        return cell
    }
}

【问题讨论】:

  • 你能发布你的整个 tableviewcontroller 类吗?我 99% 确定我知道这里发生了什么,但是如果没有完整的代码,将很难帮助您进行修复。
  • 您在何时/何地实际设置单元格内容?我怀疑您在重用单元格时没有正确设置数据。

标签: ios iphone swift tableview cells


【解决方案1】:

来自 UITableView 上的Apple docs

当表格视图要求数据源配置一个单元格对象进行显示时,数据源可以通过向表格视图发送 dequeueReusableCellWithIdentifier: 消息来访问排队对象,并传入一个重用标识符。数据源在返回之前设置单元格的内容和任何特殊属性。这种单元对象的重用是一种性能增强,因为它消除了单元创建的开销。

因此,在这种情况下,您将indexPath 的值存储在单元格属性“cellIndex”中,其他单元格可以重用该值。因此,它会根据之前在队列中分配的值随机显示。

为了遇到这种情况,您可以将值存储到 viewController 中的数组变量中,这样每次数据源想要重新创建单元格时,它都会从数组中一致地获取。

其次,可以直接将indexPath赋给UILabel等单元格ui元素。

cell.titleLabel.text = "\(indexPath)"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 2021-06-14
    • 1970-01-01
    • 2019-05-27
    • 2020-10-22
    • 2011-07-10
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多