TableViewCell no se vuelve a cargar como se esperaba

Tengo una pequeña aplicación que rastrea a los jugadores jugando en un juego de deportes. Tengo una list de juegos deportivos, y puedes hacer clic en uno y comenzar a rastrear los detalles del juego. Estoy intentando hacerlo para que si un juego está en progreso y el usuario regresa a la list de juegos, no puede hacer clic en otra celda del juego ya que sobrescribe todos los datos actuales en el juego activo.

Casi he hecho este trabajo. Cuando un juego está en progreso y regrese a la list de juegos deportivos, solo el activo es accesible y muestra al usuario que está activo. Pero cuando vuelvo y reinicio ese juego, espero que se pueda acceder a la tabla de los juegos de deportes. Pero no lo son. Todavía muestra solo un juego activo y todos los demás juegos son inaccesibles. Estoy usando tableView.reloadData dentro de viewWillAppear. También mostré el código relevante a continuación.

// gameViewController -> shows all the games you can track override func viewWillAppear(_ animated: Bool) { self.tableView.reloadData() for game in fetchedResultsController.fetchedObjects! { print("Game Opposition is \(game.opposition)") print("Is Playing? \(game.isPlaying)") print("Current Playing Time \(game.currentGameTime)") print("----------------------") } } // game cell view controller -> checks to see if any games are in progress func isAnyGamesInProgress(games: [Game]) -> Bool { let inProgressGames = games.filter({ Int($0.currentGameTime) > 0 && $0.gameComplete == false }) if inProgressGames.isEmpty { return false } return true } // configures the games cells in tableview func configureFixtureCell(fixture: Game){ oppositionLabel.text = "\(fixture.team.name) v \(fixture.opposition)" // check if any games are currently in progress, if so disable all the other cells // this prevents a user being mid game and checking an old game and inadvertently updating all the played time values let games = fixture.team.game?.allObjects as! [Game] if isAnyGamesInProgress(games: games){ isUserInteractionEnabled = false inPlayLabel.isHidden = true // identifies that this game is in progress } // unset the sole game who's in progress if Int(fixture.currentGameTime) > 0 && !fixture.gameComplete { isUserInteractionEnabled = true // makes this cell active // show label as green dot inPlayLabel.isHidden = false inPlayLabel.layer.cornerRadius = 8 inPlayLabel.layer.masksToBounds = true } } 

Ahora esto funciona cuando tengo un juego en progreso. Regreso a la list de juegos y el juego activo es accesible y muestra la pequeña label y todas las demás celdas de juegos están inactivas. Pero si vuelvo y reinicio el juego, entonces ya no está activo, todos los juegos deberían mostrarse y ser accesibles. Pero el juego que estaba activo todavía se muestra como activo y todas las demás celdas del juego son inaccesibles.

He confirmado que cuando he reiniciado el juego, no se está clasificando como todavía activo al imprimir un post en la llamada isAnyGamesInProgress () en configureFixtureCell (). ¿Tan inseguro por qué las filas no parecen actualizarse, especialmente cuando recargo la tabla cuando el controller de la list de juegos se activará ()? y no estoy almacenando el resultado de los juegos NSFecthController 🙂

Adjunto algunas imágenes para mostrar también la salida de la console. Primero es la carga inicial

Carga inicial

Juego en progreso introduzca la descripción de la imagen aquí

Después de reiniciar el juego introduzca la descripción de la imagen aquí

Al mirar el código, parece un problema reutilizable de reinicio celular.

Intente restablecer la celda en el método prepareForReuse ().

Sustitúyalo en la subclass de su celda y se llamará cada vez que una celda previamente existente sea dequeuedReusableCellWithReuseIdentifier.

Ejemplo en Swift

 class myCell: UITableViewCell { ... ... override func prepareForReuse() { // your cleanup code } }