我有一堆帖子被加载到一个表视图中,我的用户应该能够进行向上投票/向下投票。类似于应用程序"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
。删除它。