TableViewCell не перезагружается должным образом
У меня есть небольшое приложение, которое отслеживает время игры игроков в спортивной игре. У меня есть список спортивных игр, и вы можете нажать на них и начать отслеживать детали игры. Я пытаюсь сделать так, чтобы, если игра в процессе и пользователь вернулся к списку игр, чтобы он не мог щелкнуть по другой игровой ячейке, поскольку она перезаписывает все текущие данные в активной игре.
Я почти сделал эту работу. Когда игра идет, и я возвращаюсь к списку спортивных игр, доступна только активная и показывает пользователю, что она активна. Но когда я возвращаюсь и перезагружаю эту игру, я ожидаю, что tableView спортивных игр будет доступен всем. Но это не так. Он по-прежнему показывает только одну активную игру, а все остальные игры недоступны. Я использую tableView.reloadData в viewWillAppear. Я показал соответствующий код ниже также.
// 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
}
}
Теперь это работает, когда у меня идет игра. Я возвращаюсь к списку игр, и активная игра доступна и показывает маленький ярлык, а все остальные ячейки игры неактивны. Но если я вернусь и сброслю игру, чтобы она перестала быть активной, все игры должны отображаться и быть доступными. Но игра, которая была активной, по-прежнему отображается как активная, а все остальные игровые ячейки недоступны.
Я подтвердил, что после сброса игры она не классифицируется как все еще активная, распечатав сообщение в вызове isAnyGamesInProgress() в configureFixtureCell(). Так что не знаете, почему строки не обновляются, особенно когда я перезагружаю таблицу, когда контроллер списка игр будет Apppear()?? и я не кеширую результат игр NSFecthController:)
Я приложил несколько изображений, чтобы показать вывод консоли тоже. Первая начальная загрузка
1 ответ
Глядя на код, это выглядит как проблема многократного сброса ячеек.
Попробуйте сбросить ячейку в методе prepareForReuse().
Переопределите его в своем подклассе ячеек, и он будет вызываться каждый раз, когда ранее существующая ячейка удаляется с помощью dequeueReusableCellWithReuseIdentifier.
Пример в Swift
class myCell: UITableViewCell {
...
...
override func prepareForReuse() {
// your cleanup code
}
}