解决tableView中的重复单元格
Posted
技术标签:
【中文标题】解决tableView中的重复单元格【英文标题】:Solving repeating cells in tableView 【发布时间】:2020-03-22 18:33:38 【问题描述】:我有一堆帖子被加载到一个表格视图中,我的用户应该能够支持/反对。类似于应用程序“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)
)
【问题讨论】:
【参考方案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
。删除它。
【讨论】:
以上是关于解决tableView中的重复单元格的主要内容,如果未能解决你的问题,请参考以下文章
重用自定义 tableView 单元格时重复显示相同的子视图(Swift 4.1)