【问题标题】:Delete Data from the cell an Firebase从 Firebase 的单元格中删除数据
【发布时间】:2019-01-27 00:47:07
【问题描述】:

我正在构建一个聊天应用程序作为 ios 编程的学习之旅。该应用程序使用 firebase 进行身份验证等。我正在尝试使用 _comit editingstyle 方法实现删除功能。但我无法从firebase。当我注销并重新登录时,能够看到旧消息。我的理解,我必须选择与单元格索引相对应的孩子。我尝试了多种组合,将观察设置为 .childremoved, .value 但没有任何效果。我将不胜感激任何帮助和解释。

var ref: DatabaseReference!

var messageArray : [Message] = [Message]()
  var postkey = ""



@IBOutlet var heightConstraint: NSLayoutConstraint!
@IBOutlet var sendButton: UIButton!
@IBOutlet var messageTextfield: UITextField!
@IBOutlet var messageTableView: UITableView!



override func viewDidLoad() {
    super.viewDidLoad()


    // declare delegate
    messageTableView.delegate = self
    messageTableView.dataSource = self
    messageTableView.register(UINib(nibName: "MessageCell", bundle: nil), forCellReuseIdentifier: "customMessageCell")



    messageTextfield.delegate = self


    ref = Database.database().reference()


    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(TableViewTapped))
    view.addGestureRecognizer(tapGesture)

    retrieveMessages()
}

// TableViewTapped method
@objc func TableViewTapped () {
    view.endEditing(true)
}


// TODO: Data source method

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {


    if editingStyle == .delete {
        let  groupeRef = ref.child("message").child((messageArray[indexPath.row].messageBody))
        groupeRef.removeValue()
        messageArray.remove(at: indexPath.row)
        print(indexPath.row)

        messageTableView.deleteRows(at: [indexPath], with: .fade)


    }
    messageTableView.reloadData()


}

消息类

class Message {
    //TODO: Messages need a messageBody and a sender variable

    var messageBody = ""
    var sender = ""
}

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    更新您的代码并确保使用子密钥:

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    
    
        if editingStyle == .delete {
    
          self.ref.child("message").child((messageArray[indexPath.row].messageBody)).removeValue { error, _ in
    
                 print(error)   
              }
            messageArray.remove(at: indexPath.row)
            print(indexPath.row)
    
            messageTableView.deleteRows(at: [indexPath], with: .fade)
    
    
        }
        messageTableView.reloadData()
    
    
    }
    

    在控制台中检查您的数据库以获取更新的值。

    【讨论】:

    • 删除整个数据库,而不是单元格对应的子节点。
    • @Vangola 请尝试我的更新答案,如果它无法删除子项,请打印关键子项并重新检查层次结构并根据更改子项引用,因为这是从 Firebase 中删除子项的简单方法实时数据库。
    • 我使用了您更新的代码并在控制台上添加了 print(self.child("Message").key) 提供 optional("Message") 。该代码不会从 tableView 中删除与单元格对应的子项。firebase 上没有发生任何事情。
    • 那么根据我更新的答案应该可以正常工作,请根据控制台检查。 :)
    • 对不起,我不能使用聊天。我是新来的。声望不够。谢谢
    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多