当我运行下面的代码时,它有时会对其他单元格进行更改而不是实际的单元格。它设置来自另一个帖子的投票。 知道为什么吗?
显示/隐藏投票视图只是 votesView.isHidden = true / false 启用/禁用对于按钮,Btns只是 btns.isEnabled = true / false 。 如果这些都可以正常工作。
这是我的PostCell代码:
override func awakeFromNib() {
super.awakeFromNib()
hideVoteViews()
let ref = DataService.ds.REF_USER_CURRENT
let likeRef = ref.child("likes")
likeRef.observeSingleEvent(of: .value) { (snapshot) in
if snapshot.hasChild(self.post.postKey){
self.setVotesLbl()
self.showVoteViews()
self.disableBtns()
} else {
self.hideVoteViews()
self.enableBtns()
}
}
}
setVotesLbl函数:
func setVotesLbl(){
if let votes = self.post?.altAVotes{
self.altAVotesLbl.text = "\(votes)"
}
if let votes = self.post?.altBVotes{
self.altBVotesLbl.text = "\(votes)"
}
if let votes = self.post?.altCVotes{
self.altCVotesLbl.text = "\(votes)"
}
if let votes = self.post?.altDVotes{
self.altDVotesLbl.text = "\(votes)"
}
}
答案 0 :(得分:1)
从nib中唤醒单元格时,不应设置观察者。因为虽然重新使用来自PostCell的awakefromnib的单元格不会被调用,因此旧单元格的数据将反映到您重用的单元格中。 更好的方法是将观察者设置为你的喜欢"喜欢"根节点并将值存储在您的数据结构中。之后,您可以使用此数据结构重新加载表。
答案 1 :(得分:1)
由于UITableview的重用性,PostCell的“awakeFromNib()”每次都不会调用“func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell”。为此,您必须致电:
func getCellData()
{
hideVoteViews()
let ref = DataService.ds.REF_USER_CURRENT
let likeRef = ref.child("likes")
likeRef.observeSingleEvent(of: .value) { (snapshot) in
if snapshot.hasChild(self.post.postKey){
self.setVotesLbl()
self.showVoteViews()
self.disableBtns()
} else {
self.hideVoteViews()
self.enableBtns()
}
}
}
in:
override func prepareForReuse() {
super.prepareForReuse()
hideVoteViews()
getCellData()
}
以及:
override func awakeFromNib() {
super.awakeFromNib()
hideVoteViews()
getCellData()
}
我希望这能解决问题:)
答案 2 :(得分:0)
您应该设置所有标签的文字,否则以前的文字会被重复使用。
您还应该使用NumberFormatter
将数值转换为数字,而不是从中创建字符串文字。
let formatter = NumberFormatter()
if let aVotes = post?.altAVotes {
altAVotesLbl.text = formatter.string(from: aVotes as NSNumber)
} else {
altAVotesLbl.text = ""
}
[...]
答案 3 :(得分:0)
首先,您需要在 cellForRowAtIndexPath 中自定义您的单元格,而不是在awakeFromNib中。
其次,您需要在重写prepareForReuse 重复使用单元格之前重置标签和视图。
override func prepareForReuse() {
super.prepareForReuse()
hideVoteViews()
self.altAVotesLbl.text = ""
}