求解tableView中的重复单元格



我有一堆帖子被加载到一个表视图中,我的用户应该能够进行向上投票/向下投票。类似于应用程序"Yik yak"。还应该有一个标签来跟踪当前的投票情况。

问题:当用户滚动并投票时,有时标签会在错误的标签上更新(即使附近的标签没有被点击,也会被投票(。然而,我的firebase数据库是正确的。我在其他帖子中也尝试过其他方法:例如prepareForReuse,但似乎不起作用。

PostCell/准备重复使用的代码:

class PostCell: UITableViewCell {
@IBOutlet weak var eventCountLabel: UILabel!
@IBOutlet weak var upvoteButton: UIButton!
@IBOutlet weak var downvotebutton: UIButton!
override func prepareForReuse() {
super.prepareForReuse()
eventCountLabel.text = String(counter)
}

手机代码(我想错误可能是我怎么读的?想法?(

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostCell
let event: EventModel
event = eventList[indexPath.row]
let count = Database.database().reference().child(event.id!).child("counter")
count.observe(DataEventType.value, with: { (snapshot) in
cell.eventCountLabel.text = "(snapshot.value!)"
})
}

点击按钮时添加+1的代码

@objc func upvoteClicked(sender:UIButton) {
let buttonRow = sender.tag
let event: EventModel
event = eventList[buttonRow]
ref.child(event.id!).child("tracker").setValue(event.tracker! - 1)
let upvoteCount = ref.child(event.id!).child("counter")
upvoteCount.observeSingleEvent(of: .value, with: { (snapshot) in
let counted = snapshot.value as? Int
self.ref.child(event.id!).child("counter").setValue(counted! + 1)
})
}

问题是您异步地从数据库检索cellForRow中的计数器值。这是一种非常糟糕的做法。

cellForRow中,只需从EventModel中设置计数器值,就可以添加适当的属性(例如counter(

let event = eventList[indexPath.row]
cell.eventCountLabel.text = String(event.counter)

let count = Database.database().reference().child(event.id!).child("counter")
count.observe(DataEventType.value, with: { (snapshot) in
cell.eventCountLabel.text = "(snapshot.value!)"
})  

upvoteClicked中,更新数据库后更新模型,然后重新加载行

@objc func upvoteClicked(sender:UIButton) {
let buttonRow = sender.tag
let event = eventList[buttonRow]
ref.child(event.id!).child("tracker").setValue(event.tracker! - 1)
let upvoteCount = ref.child(event.id!).child("counter")
upvoteCount.observeSingleEvent(of: .value, with: { (snapshot) in
let counted = snapshot.value as? Int
self.ref.child(event.id!).child("counter").setValue(counted! + 1)
event.counter = counted + 1
let indexPath = IndexPath(row: buttonRow, section: 0)
self.tableView.reloadRows(at: [indexPath],  with:. automatic)
})
}

不需要单元中的方法prepareForReuse。删除它。

最新更新