滚动时UITableView改组

时间:2017-07-10 16:41:39

标签: ios iphone swift tableview cells

我有一个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
    }
}

1 个答案:

答案 0 :(得分:0)

来自UITableView上的Apple docs

  

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

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

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

其次,您可以直接将indexPath分配给单元格ui元素,例如UILabel。

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