ios - 如何在 Firebase 中删除 TableView 项后删除它们

标签 ios uitableview tableview

我的 tableview 当前会更新我的表,并在新项目添加到我的 firebase 数据库时实时添加它们。问题是我不能实时删除。我将来自 firebase 的数据存储在本地数组中,然后将该数组加载到 tableview。

我试图压缩我的代码。我还尝试将我的 removeDeletedItems() 函数中的 Firebase 代码放入我的 populateArrays() 函数中,并将其放在 .childAdded 监听器之后,但没有实时删除数据。

override func viewDidLoad() {

        super.viewDidLoad()
        populateArrays()        

    }


    func removeDeletedItems() {

        let databaseRef = FIRDatabase.database().reference()
        databaseRef.child("Users").observe(FIRDataEventType.childRemoved, with: { (FIRDataSnapshot) in

            guard let emailToFind = FIRDataSnapshot.value as? String else { return }
            for (index, email) in self.usernames.enumerated() {
                if email == emailToFind {
                    let indexPath = IndexPath(row: index, section: 0)
                    self.usernames.remove(at: index)
                    self.tableView.deleteRows(at: [indexPath], with: .fade)
                    self.tableView.reloadData()
                }
            }
        })
    }

 func populateArrays(){

        let databaseRef = FIRDatabase.database().reference()
        databaseRef.child("Users").observe(FIRDataEventType.childAdded, with: { (FIRDataSnapshot) in

            if let data = FIRDataSnapshot.value as? NSDictionary {
                if let name = data[Constants.NAME] as? String {

                                self.usernames.append(name)
                                self.removeDeletedItems()
                                self.tableView.reloadData()
                }
            }
        })
    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        cell.textLabel?.text = usernames[indexPath.row]        
        return cell
    }

最佳答案

观察值不总是一个字典吗?难道你不应该检查姓名而不是电子邮件吗?

不需要循环查找名称。有一个方便的功能。

databaseRef.child("Users").observe(FIRDataEventType.childRemoved, with: { snapshot in

            guard let data = snapshot.value as? [String:Any],
                  let nameToFind = data[Constants.NAME] as? String else { return }
                if let index = self.usernames.index(of: nameToFind) {
                     let indexPath = IndexPath(row: index, section: 0)
                     self.usernames.remove(at: index)
                     self.tableView.deleteRows(at: [indexPath], with: .fade)
                     // don't reload the table view after calling `deleteRows`
                 }
             }
        })

关于ios - 如何在 Firebase 中删除 TableView 项后删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45310357/

相关文章:

ios - Development Provisioning Profile 似乎不合格,没有明显的影响

javascript - iOS Safari 在 window.location.href = ... 上暂停动画?

ios - 当单元格文本标签太长时,UITableViewCell的detailTextLabel文本消失

swift - 从 'table view' 和 'filtered search bar' 删除行不起作用

swift - 将数据从 viewcontroller tableview 传递到另一个 View Controller

ios - 自定义导航栏不适用于半透明

iphone - 如何使用 base64 解码数据并在 objective-c 中另存为文件对象?

ios - 将 Tableview 单元格的文本传递给 RootViewController

ios - 对于 UITableViewCell 内的嵌套 UITableView didSelectRowAt indexPath : is not being called

ios - 如何让按钮根据按下的行显示不同的视频?