滚动Swift时tableView的值重复

时间:2016-01-20 08:36:42

标签: ios arrays swift uitableview

我有一个tableView来显示工作日的时间

在tableView中使用timingsArray来显示时间

timerObj类型的timingsArray

class timingObj {
    var dayNo: Int?
    var open: String?
    var close: String?
    var dayName: String?

     init(json: JSON){
        // to take data from json
    }

    init(name: String, number: Int){
        self.dayName = name
        self.dayNo = number
    }
}
在tableView中我希望显示所有日期及其时间,如果当天没有时间,则计时单元格将为空

let cell = tableView.dequeueReusableCellWithIdentifier("TimingsCell", forIndexPath: indexPath) as! timingCell     
            let timings = self.Details!.timingsArray
            let dayTime = timings[indexPath.row]
            cell.dayLabel.text = dayTime.dayName
            if dayTime.open != nil && dayTime.close != nil {
                cell.timeLabel.text = "\(convertTimeFormat(dayTime.open!)) - \(convertTimeFormat(dayTime.close!))"
            }
            return cell

这是单元格的类

class timingCell: UITableViewCell {

    @IBOutlet weak var dayLabel: UILabel!

    @IBOutlet weak var timeLabel: UILabel!

}

例如星期二和星期四只有时间

问题是当我向上和向下滚动时,周二的定时值在周三重复,当我继续滚动时,定时值在其他单元格中也会重复

有什么想法吗?提前谢谢

3 个答案:

答案 0 :(得分:9)

您应该在自定义单元格类中实现prepareForReuse,您可以在其中重置需要重置的内容。例如:

class timingCell: UITableViewCell {

    @IBOutlet weak var dayLabel: UILabel!

    @IBOutlet weak var timeLabel: UILabel!

    func prepareForReuse() {
        super.prepareForReuse()
        cell.timeLabel.text = nil
        cell.dayLabel.text = nil
    }
}

答案 1 :(得分:6)

prepareForReuse方法添加到您将单元格重置为其初始状态的单元格类与@CH Uck的答案具有相同的效果

例如:

func prepareForReuse() {
   super.prepareForReuse()
   self.dayLabel.text = ""
   self.timeLabel.text = ""
}

另见: Apple开发人员文档中的prepareForReuse

答案 2 :(得分:5)

来自Apple Docs:

  

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

因此,当您重新使用队列中的单元格时,您正在执行的操作是检索已创建和配置的单元格。对创建的单元格所做的更改也将应用于重用的单元格,一旦重用的单元格不再可见,滚动时就会显示这些单元格。这意味着您必须重新分配要覆盖的任何值,这些值是您要显示的唯一单元格的自定义,如果没有要显示的内容/空字符串,这也适用。否则,您将获得随机的结果。

let cell = tableView.dequeueReusableCellWithIdentifier("TimingsCell", forIndexPath: indexPath) as! timingCell     
let timings = self.Details!.timingsArray
let dayTime = timings[indexPath.row]
cell.dayLabel.text = dayTime.dayName

if dayTime.open != nil && dayTime.close != nil {
    cell.timeLabel.text = "\(convertTimeFormat(dayTime.open!)) - \(convertTimeFormat(dayTime.close!))"
}
else{
 //change label to empty string when reusing
 cell.timeLabel.text = "";
}

return cell