2017-06-04 30 views
7

我有一個小應用程序,可以跟蹤玩家在體育比賽中玩的時間。我有一個體育比賽列表,你可以點擊進入並開始跟蹤比賽細節。我試圖做到這一點,如果遊戲正在進行並且用戶返回到遊戲列表,那麼他們不能點擊另一個遊戲單元格,因爲它會覆蓋活動遊戲中的所有當前數據。TableViewCell不按預期方式重新加載

我幾乎完成了這項工作。當遊戲進行時,我回到體育遊戲列表中,只有活動遊戲可以訪問,並向用戶顯示它是活躍的。但是當我回去重新設置遊戲時,我期望所有體育遊戲的tableView都可以訪問。但他們不是。它仍然只顯示一個活動的遊戲,其他所有遊戲都無法訪問。我在viewWillAppear中使用tableView.reloadData。我也在下面顯示了相關的代碼。

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

現在這個工程,當我有一個遊戲進行中。我回到遊戲列表中,並且可以訪問活動的遊戲並顯示小標籤和所有其他遊戲單元不活動。但是如果我回去重置遊戲,所以它不再活躍,所有的遊戲都應該顯示並且可以訪問。但是活躍的遊戲仍然顯示爲活躍遊戲,所有其他遊戲單元都無法訪問。

我已經確認,當我通過在configureFixtureCell()中的isAnyGamesInProgress()調用中打印出消息來重置遊戲時,它不會被歸類爲仍然活動的遊戲。所以不確定爲什麼這些行似乎沒有更新,特別是當我重新加載表時,遊戲列表控制器willAppear()?而且我不緩存遊戲NSFecthController :)

我已經附加了一些圖片顯示控制檯輸出過多的結果。首先是初始加載

Initial Load

比賽正在進行遊戲復位enter image description here

+0

不能真正從代碼告訴,但可以把它涉及到通過fetchedResultsController並獲得在viewWillAppear中的最新數據不是一樣像這樣獲得的副本'讓games = fixture.team.game?.allObjects as! [遊戲]' –

+0

@UpholderOfTruth我只是寫一個for循環進FixtureViewCell打印出的價值觀和他們相匹配的fetchedResultsController – Jonnny

+0

什麼這行的值'如果INT(fixture.currentGameTime)> 0 &&!fixture.gameComplete { '?請問fixture.currentGameTime是否仍然大於零並且與fixture.team.game對象中的值不同? –

回答

3

enter image description here

後看代碼,它看起來像一個可重複使用的電池復位的問題, 。

嘗試重置prepareForReuse()方法中的單元格。

覆蓋它在你的子類,它都會被調用時,先前存在的細胞被dequeueReusableCellWithReuseIdentifier出隊的時間。

實例斯威夫特

class myCell: UITableViewCell { 

    ... 
    ... 
    override func prepareForReuse() { 
    // your cleanup code 
    } 

} 
+1

我相信你是對的,因爲我的解決方案是在'if isAnyGamesInProgress()'中明確設置兩個條件。你能否爲你的答案展示一個演示代碼?我覺得你的答案可能更正確,從而對讀者更有幫助。謝謝:-) – Jonnny

+0

用prepareForReuse()更新了答案 –