我有一个函数来处理删除包含注释的表视图的行:
------------------
Hello World from Java code ...
========================
callingMain0 ...
------------------------
Hello World from Frege code ...
========================
callingMain1 ...
------------------------
========================
callingMain2 ...
------------------------
Hello World from Frege code ...
========================
使用此选项,注释将从表视图中删除,但由于它仍在我的数据库中,因此在再次加载表时会重新显示该注释。我试图弄清楚如何从数据库中删除选定的行/注释,同时从表中删除它。
我猜测我必须使用func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
selectedPost.comments.remove(at: indexPath.row)
selectedPost.commentAuthors.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
// Remove from Firebase
let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
postsCommentsRef.observe(.childRemoved, with: { snapshot in
// ??
self.tableView.reloadData()
})
}
}
,如上所示,但我不确定如何指定要在数据库中删除的确切注释。我理解从tableview中删除,因为我只是删除indexPath中的注释,它位于我的Post对象中的数组.childRemoved
和selectedPost.comment
中。但是它们并没有保存在Firebase中的数组中。这是评论的添加方式:
selectedPost.commentAuthors
仍然习惯了Firebase,所以感谢任何帮助!
编辑(新):
新的tableview方法:
// Upload to Firebase
func addComment(comment: String) {
let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
var commentData: [String: String] = [:]
commentData["userId"] = FIRAuth.auth()!.currentUser!.displayName!
commentData["comment"] = comment
postsCommentsRef.childByAutoId().setValue(commentData)
}
// Listens for changes, appends arrays & uploads table view
func observePostComments() {
let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
postsCommentsRef.observe(.childAdded, with: { snapshot in
let comment = snapshot.value as! [String: String]
self.selectedPost.commentAuthors.append(comment["userId"]!)
self.selectedPost.comments.append(comment["comment"]!)
self.tableView.reloadData()
})
}
观察帖子评论:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let comment = selectedPost.comments[indexPath.row]
selectedPost.comments.remove(at: indexPath.row)
selectedPost.commentAuthors.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
// Remove from Firebase
FIRDatabase.database().reference().child("postComments").child(self.postID).child(comment.key).removeValue()
}
}
删除评论的观察者功能:
func observePostComments() {
let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
postsCommentsRef.observe(.childAdded, with: { snapshot in
let comment = snapshot.value as! [String: String]
comment.key = snapshot.key
self.selectedPost.commentAuthors.append(comment["userId"]!)
self.selectedPost.comments.append(comment["comment"]!)
self.tableView.reloadData()
})
}
答案 0 :(得分:1)
所以,如果我理解这一点。 您用来删除评论的代码是不对的。
// Remove from Firebase
let postsCommentsRef = FIRDatabase.database().reference().child("postComments").child(self.postID)
postsCommentsRef.observe(.childRemoved, with: { snapshot in
// ??
self.tableView.reloadData()
})
你在这里做的是创建一个观察者,当你从你设置的引用中删除某些内容时,它会侦听remove事件和触发器。这实际上并没有从firebase中删除任何内容。 你的想法是对的,但是如果你问我这个代码应该位于这个区域之外的某个地方。相反,您应该将此代码放在块中,以实际删除数据库中的注释:
FIRDatabase.database().reference().child("postComments").child(self.postID).removeValue()
将观察者放在viewDidLoad
中的某个位置或为observePostComments()
创建函数。当它触发时,你应该像你已经写过的那样打电话给self.tableView.reloadData()
。