我有一个表格视图,上面有喜欢和不喜欢特定帖子的功能。我的问题是,如果您喜欢某个帖子,它会正确显示,但是如果您向下滚动然后向上滚动,则会忘记。我该怎么解决?
@IBAction func voteAction(_ sender: UIButton)
{
let stream_id = streamsModel.streamID[sender.tag]
let profile_id = streamsModel.Profile_ID[sender.tag]
streamsModel.voteStatusv = streamsModel.VoteStatus[sender.tag]
streamsModel.Likes = streamsModel.Votes[sender.tag]
streamsModel.streamIDv = streamsModel.streamID[sender.tag]
let cellT = getCellForView(view: sender)
let indexPath = TableSource.indexPath(for: cellT!)
if (indexPath != nil) {
let cell = TableSource.cellForRow(at: indexPath!) as! HomeTVC
if streamsModel.likeStatus == "0" {
// Liked
cell.votes.setTitle(String(streamsModel.Likes+1), for: UIControlState.normal)
cell.likeImage.setImage(UIImage(named: "like2"), for: .normal)
} else {
// Unliked
cell.votes.setTitle(String(streamsModel.Likes-1), for: UIControlState.normal)
cell.likeImage.setImage(UIImage(named: "like"), for: .normal)
}
// This snippet below causes an error
//TableSource.reloadRows(at: [indexPath!], with: .none)
}
}
上面的代码只是检查您是否喜欢onClick,如果是,它将为计数增加+1并将图像更改为like。如果您不喜欢某些东西,则它将在计数器上执行-1并将图像更改为默认图像。同样,一切正常。我唯一的问题是,如果我向下滚动然后向上备份,则会忘记我喜欢的东西。解决此问题的唯一方法是调用tableView.reloadData()
。但是,这太多了,因为我只更新1个单元格。有什么建议吗?
答案 0 :(得分:2)
您还需要更改模型数组中的值,否则在滚动表视图时会获得旧值。尝试此代码
if (indexPath != nil) {
let cell = TableSource.cellForRow(at: indexPath!) as! HomeTVC
if streamsModel.likeStatus == "0" {
// Liked
streamsModel.Likes = streamsModel.Votes[sender.tag] + 1
cell.votes.setTitle(String(streamsModel.Likes+1), for: UIControlState.normal)
cell.likeImage.setImage(UIImage(named: "like2"), for: .normal)
} else {
// Unliked
streamsModel.Likes = streamsModel.Votes[sender.tag] - 1
cell.votes.setTitle(String(streamsModel.Likes-1), for: UIControlState.normal)
cell.likeImage.setImage(UIImage(named: "like"), for: .normal)
}
// This snippet below causes an error
//TableSource.reloadRows(at: [indexPath!], with: .none)
}
答案 1 :(得分:2)
您可以使用reloadRows(at:with :)方法
tableView.reloadRows(at: [IndexPath], with: UITableViewRowAnimation)
注意:此方法接受一个IndexPath数组,如果您只需要重新加载单个单元格,则需要在数组中传递该IndexPath。
此外,间歇性的/不相同的问题在可重复使用的单元格中很常见。您需要单独维护该选择,以仅在选定的单元格上适当显示。如果我对您的工作有更多的了解,我可能会为您提供确切的解决方案。
答案 2 :(得分:1)
将这段代码放入表决按钮的操作中,然后重新加载特定的单元格。
let indexPath = IndexPath(item: sender.tag, section: 0)
tableView.reloadRows(at: [indexPath], with: .none)