Duplicación en valores de tableView al desplazarse por Swift

Tengo un tableView para mostrar los horarios de los días de semana

timingsArray se usa en tableView para mostrar los times

TimingsArray del tipo timingObj

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 } } 

en tableView quiero mostrar todos los días y sus horarios, si el día no tiene time, entonces la celda de time estará vacía

 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 

Esta es la class de la celda

 class timingCell: UITableViewCell { @IBOutlet weak var dayLabel: UILabel! @IBOutlet weak var timeLabel: UILabel! } 

Por ejemplo, los martes y jueves solo tienen horarios

el problema es cuando me desploop hacia arriba y hacia abajo, el valor de time del martes se duplica en miércoles, y cuando sigo desplazándome, los valores de time también se duplican en otras celdas

¿Algunas ideas? Gracias de antemano

De los Apple Docs:

En time de ejecución, la vista de tabla almacena objects de celda en una queue interna. Cuando la vista de tabla le pide al origen de datos que configure un object de celda para su visualización, el origen de datos puede acceder al object en queue enviando un post dequeueReusableCellWithIdentifier: post a la vista de tabla, pasando un identificador de reutilización. El origen de datos establece el contenido de la celda y las properties especiales antes de devolverlo. Esta reutilización de objects de celda es una mejora de performance porque elimina la sobrecarga de la creación de celdas.

Entonces, lo que está haciendo cuando reutiliza celdas de la queue es recuperar celdas que ya ha creado y configurado. Los cambios realizados en las celdas creadas también se aplicarán a las celdas reutilizadas que se muestran cuando se desplaza tan pronto como las celdas reutilizadas ya no son visibles. Esto significa que tiene que volver a asignar los valores que desee anular, que son personalizados para la celda única que está mostrando, que también se aplica si no hay contenido / una cadena vacía que desea mostrar. De lo contrario, obtendrás resultados aleatorios como lo has estado experimentando.

 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 

Debería implementar prepareForReuse en su class de celda personalizada, en la que restablece lo que necesita reiniciarse. Por ejemplo:

 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 } } 

Agregar un método prepareForReuse a la class de celda en la que restablece la celda a su estado inicial tiene el mismo efecto que la respuesta de @CH Uck

Por ejemplo:

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

Consulte también: prepareForReuse en la documentation de desarrollador de Apple.