TableViewCell 未按预期重新加载
TableViewCell doesn't reload as expected
我有一个小应用程序可以跟踪玩家在体育游戏中的玩时间。我有一个体育比赛列表,你可以点击其中一个并开始跟踪比赛详情。我正在努力做到这一点,以便如果游戏正在进行并且用户返回到游戏列表,他们将无法单击另一个游戏单元格,因为它会覆盖活动游戏中的所有当前数据。
我几乎完成了这项工作。当一场比赛正在进行中并且我返回到体育比赛列表时,只有活跃的比赛可以访问并向用户显示它是活跃的。但是当我返回并重置该游戏时,我希望 table 体育游戏的视图都可以访问。但他们不是。它仍然只显示一个活动游戏,所有其他游戏都无法访问。我在 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([=10=].currentGameTime) > 0 && [=10=].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() 调用中打印出一条消息,它不会被归类为仍处于活动状态。所以不确定为什么行似乎没有更新,特别是当我重新加载 table 时游戏列表控制器 willAppear()?而且我没有缓存游戏 NSFecthController 的结果 :)
我也附上了一些图片来显示控制台输出。首先是初始加载
游戏进行中
游戏重置后
看代码,好像是reusable cell reset问题。
尝试在 prepareForReuse() 方法中重置单元格。
在您的单元格子类中重写它,每次当先前存在的单元格通过 dequeueReusableCellWithReuseIdentifier 出队时都会调用它。
Swift
中的示例
class myCell: UITableViewCell {
...
...
override func prepareForReuse() {
// your cleanup code
}
}
我有一个小应用程序可以跟踪玩家在体育游戏中的玩时间。我有一个体育比赛列表,你可以点击其中一个并开始跟踪比赛详情。我正在努力做到这一点,以便如果游戏正在进行并且用户返回到游戏列表,他们将无法单击另一个游戏单元格,因为它会覆盖活动游戏中的所有当前数据。
我几乎完成了这项工作。当一场比赛正在进行中并且我返回到体育比赛列表时,只有活跃的比赛可以访问并向用户显示它是活跃的。但是当我返回并重置该游戏时,我希望 table 体育游戏的视图都可以访问。但他们不是。它仍然只显示一个活动游戏,所有其他游戏都无法访问。我在 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([=10=].currentGameTime) > 0 && [=10=].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() 调用中打印出一条消息,它不会被归类为仍处于活动状态。所以不确定为什么行似乎没有更新,特别是当我重新加载 table 时游戏列表控制器 willAppear()?而且我没有缓存游戏 NSFecthController 的结果 :)
我也附上了一些图片来显示控制台输出。首先是初始加载
游戏进行中
游戏重置后
看代码,好像是reusable cell reset问题。
尝试在 prepareForReuse() 方法中重置单元格。
在您的单元格子类中重写它,每次当先前存在的单元格通过 dequeueReusableCellWithReuseIdentifier 出队时都会调用它。
Swift
中的示例class myCell: UITableViewCell {
...
...
override func prepareForReuse() {
// your cleanup code
}
}