解决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)

将项目动态添加到 TableView 导致重复单元格

重用 tableview 单元格中的元素

如何在 TableView 中添加不同的自定义单元格 [重复]

如何使用不可重复使用的表格视图单元格?

如何在tableview的单元格内使用uiwebview并避免在重用单元格顶部加载页面[重复]