【问题标题】:Swift / Firebase Tableview cells not refreshing after child removedSwift / Firebase Tableview 单元格在删除子项后不刷新
【发布时间】:2018-01-08 16:32:22
【问题描述】:

我意识到这有点乱,但我正在通过将教程和参考资料拼凑在一起来了解事情的工作原理。 我的问题是当我从 firebase 中删除一个节点时,tableview 没有更新。它已从 firebase 中删除,但单元格仍保留在 tableview 中。虽然下面没有显示,但我尝试在我认为应该去的每个地方添加 mytableview.reload 代码块,但我没有成功。任何意见表示赞赏。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return eventsList.count

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = myTableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! ViewControllerTableViewCell
    cell.locationLabel.text = eventsList[indexPath.row].location
    cell.eventTimeLabel.text = eventsList[indexPath.row].dateTime
    cell.eventTypeLabel.text = eventsList[indexPath.row].agencyEventSubtypeCode
    cell.agencyIdLabel.text = eventsList[indexPath.row].agencyId

    if eventsList[indexPath.row].alarmLevel == "1" {
        cell.locationLabel.textColor = UIColor.red
        cell.eventTimeLabel.textColor = UIColor.red
        cell.eventTypeLabel.textColor = UIColor.red
        cell.agencyIdLabel.textColor = UIColor.red
    }
    return cell
}



    ref = Database.database().reference()
    fetchData()
}

func fetchData(){
    refHandle = ref?.child("caddata").observe(.childAdded, with: { (snapshot) in

        if let dictionary = snapshot.value as? [String: Any] {

            let event =  Events()
            event.setValuesForKeys(dictionary)
            if event.originatingAction == "CadEventNew" {
                   self.eventsList.append(event)

                DispatchQueue.main.async {
                    self.myTableView.reloadData()
                }

            } else if event.originatingAction == "CadCloseEvent" {
                self.cadPacketType = event.originatingAction
                self.cadEventNumber = event.agencyEventId
                self.queryCloseUIDFromDB()
            }
        }
    })
}

func queryCloseUIDFromDB(){

    if cadPacketType == "CadCloseEvent" {

        let dataRef = ref?.child("caddata")
        let queryRef = dataRef?.queryOrdered(byChild: "agencyEventId")
            .queryEqual(toValue: cadEventNumber)

        queryRef?.observeSingleEvent(of: .value, with: { (snapshot) in

            for snap in snapshot.children {
                let dataSnap = snap as! DataSnapshot
                self.closeUID = dataSnap.key //the uid of each event

                if self.closeUID != nil {
                    self.deleteFromDB()

                    DispatchQueue.main.async {
                        self.myTableView.reloadData()
                    }
                }
            }
        })
    }
}

func deleteFromDB () {
    if closeUID != nil {
        print (cadEventNumber!)
        print (closeUID!)
        ref?.child("caddata").child(closeUID!).removeValue(completionBlock: { (error, ref) in
            if error != nil {
                self.fetchData()
                print("Error: \(String(describing: error))")
                return
                    }
                })
            }
        print ("\(String(describing: closeUID)) has been removed")
}

【问题讨论】:

  • 你能发布你的UITableViewDataSource方法吗?
  • 在您的deleteFromDB 方法中,您需要更新您的数组并调用tableView.reloadData()
  • 你能指出我如何更新数组的正确方向吗?我在原帖中添加了tableview函数
  • 调用fetchData 方法如果在你删除值的闭包中没有出现错误,请告诉我
  • 我尝试了 fetchData 的想法,但没有奏效。当我从地图 segue 返回时,它会正确重新加载,但在 deleteFromDB func 的 if 语句中调用 fetchData 时则不会

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

删除后需要重新取数据,

用这个替换你的deleteFromDB方法,你的fetchData必须执行if error == nil

func deleteFromDB () {
    if closeUID != nil {
        print (cadEventNumber!)
        print (closeUID!)
        ref?.child("caddata").child(closeUID!).removeValue(completionBlock: { (error, ref) in
            if error != nil {
                print("Error: \(String(describing: error))")
                return
            }
            //clean the array
            self.eventsList.removeAll()
            self.fetchData()
        })
    }
    print ("\(String(describing: closeUID)) has been removed")
}

【讨论】:

  • 我试过这个,它似乎也不起作用。通过回忆 fetchData,我最终只是一遍又一遍地将相同的列表附加到我的 tableview 中,它仍然没有删除包含已删除节点数据的单元格。
  • @jvan 再次检查我的答案,我认为您需要在调用 fetchData 方法之前清理数组,让我知道最终是否有效
  • 这工作了很短的时间然后我得到致命错误:索引超出范围。
猜你喜欢
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2018-09-01
相关资源
最近更新 更多