微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift Tableview 可重用单元格问题

如何解决Swift Tableview 可重用单元格问题

我认为 tableview 单元格中的可重用单元格有问题,不幸的是我无法弄清楚如何强制单元格的状态。我很确定这是问题所在,因为当我重新加载 tableview 时,一切都显示正确。只有当我滚动时才开始看到问题,如果我再次重新加载显示会自行纠正。

这是正确的显示

enter image description here

以及滚动后的错误显示

enter image description here

我的 cellForRowAt 代码

  override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "historyGoalCell",for: indexPath)
        
        let name = items[indexPath.section][indexPath.row].name
        let date = dateManager.dateAsstring(for: items[indexPath.section][indexPath.row].date!)
        
        
        if tempDate != date {
            
            // show header
            
            cell.textLabel?.text = date
            
            tempDate = date
            
        } else {
            
            // don't show header
            
            cell.textLabel?.text = ""
              
        }
        
        cell.detailTextLabel?.text = "\(date),\(name ?? "")"
        
        return cell
    }

感谢您的帮助,我已经坚持了几天,对 TableViews 非常陌生 - 谢谢

解决方法

tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell

可以以任何顺序调用。它不是从 1 到 N 始终如一地调用,因此带有 tempDate 的逻辑无法按计划工作。最好做一些准备工作,并在放置标题的位置创建一个带有索引的数组。例如

struct Pair : Hashable {
    var i : Int
    var j : Int
}

//Somewhere one time before the first reloadData

var hasIndex : Set<Pair> = []
var tempDate: Date = Date.distantPast

for i in 0..<sections {
    for j in 0..<rows[i] {
        let name = items[i][j].name
        let date = dateManager.dateAsString(for: items[i][j].date!)
        if tempDate != date {
            hasIndex.insert(Pair(i: i,j: j))
            // OR items[i][j].showHeader = true
            tempDate = date
        } else {
            // OR items[i][j].showHeader = false
        }
    }
}

...

override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "historyGoalCell",for: indexPath)
    let name = items[indexPath.section][indexPath.row].name
    let date = dateManager.dateAsString(for: items[indexPath.section][indexPath.row].date!)

    if hasIndex.contains(Pair(i: indexPath.section,j: indexPath.row)) {
    // OR if items[indexPath.section][indexPath.row].showHeader {
        cell.textLabel?.text = date
        tempDate = date
    } else {
        cell.textLabel?.text = ""
    }

    cell.detailTextLabel?.text = "\(date),\(name ?? "")"

    return cell
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。