Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 点击更新tableView单元格中的Firebase数据_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 点击更新tableView单元格中的Firebase数据

Ios 点击更新tableView单元格中的Firebase数据,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在使用Firebase实时数据库在tableView中显示帖子。当用户双击相应的单元格时,我想增加特定帖子的赞数 我让双击开始工作,并且已经打印出正确的indexPath override func viewDidLoad() { super.viewDidLoad() // double tap let doubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(hand

我正在使用Firebase实时数据库在tableView中显示帖子。当用户双击相应的单元格时,我想增加特定帖子的赞数

我让双击开始工作,并且已经打印出正确的
indexPath

override func viewDidLoad() {
  super.viewDidLoad()
  // double tap
  let doubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap(sender:)))
  doubleTapGestureRecognizer.numberOfTapsRequired = 2
  postTableView.addGestureRecognizer(doubleTapGestureRecognizer)
}
以下是我根据Firebase文档尝试更新的内容:

func handleDoubleTap(sender: UITapGestureRecognizer) {
  let touchPoint = sender.location(in: postTableView)
  if let indexPath = postTableView.indexPathForRow(at: touchPoint) {
    print(indexPath)
    let post = posts[indexPath.row]
    let oldLikes = post.likes
    let newLikes = oldLikes! + 1
    let postUpdates = ["\(post.likes)": newLikes]
    database.updateChildValues(postUpdates)
    postTableView.reloadData()
  }
}
它不会抛出任何错误,但不起作用

这是数据库结构:

下面是我如何声明数据库的:

struct post {
  let author : String!
  let creationDateTime : String!
  let content : String!
  let likes : Int!
}
viewDidLoad

let database = FIRDatabase.database().reference()
database.child("Posts").queryOrderedByKey().observe(.childAdded, with: {
  snapshot in
  let postID = (snapshot.value as? NSDictionary)?["postID"] as? String ?? ""
  let author = (snapshot.value as? NSDictionary)?["author"] as? String ?? ""
  let content = (snapshot.value as? NSDictionary)?["content"] as? String ?? ""
  let creationDateTime = (snapshot.value as? NSDictionary)?["creationDateTime"] as? String ?? ""
  let likes = (snapshot.value as? NSDictionary)?["likes"] as? Int ?? 0
  self.posts.insert(post(postID: postID, author: author, creationDateTime: creationDateTime, content: content, likes: likes), at: 0)
  self.postTableView.reloadData()
})
以下是我创建帖子的方式:

@IBAction func savePost(_ segue:UIStoryboardSegue) {
    let addPostVC = segue.source as! AddPostViewController
    let author = currentUser.displayName
    let date = Date()
    let formatter = DateFormatter()
    formatter.dateFormat = "dd.MM.yyyy"
    let dateResult = formatter.string(from: date)
    let creationDateTime = "\(dateResult)"
    let content = addPostVC.passTextContent
    let likes = 0
    let post : [String : AnyObject] = ["author" : author as AnyObject,
                                       "content" : content as AnyObject,
                                       "creationDateTime" : creationDateTime as AnyObject,
                                       "likes" : likes as AnyObject]
    database.child("Posts").childByAutoId().setValue(post)
}
这就是我如何在
viewDidLoad

let database = FIRDatabase.database().reference()
database.child("Posts").queryOrderedByKey().observe(.childAdded, with: {
  snapshot in
  let postID = (snapshot.value as? NSDictionary)?["postID"] as? String ?? ""
  let author = (snapshot.value as? NSDictionary)?["author"] as? String ?? ""
  let content = (snapshot.value as? NSDictionary)?["content"] as? String ?? ""
  let creationDateTime = (snapshot.value as? NSDictionary)?["creationDateTime"] as? String ?? ""
  let likes = (snapshot.value as? NSDictionary)?["likes"] as? Int ?? 0
  self.posts.insert(post(postID: postID, author: author, creationDateTime: creationDateTime, content: content, likes: likes), at: 0)
  self.postTableView.reloadData()
})

您的数据库引用有问题。当您执行
let database=FIRDatabase.database().reference()
时,您将引用数据库结构中的主节点。这意味着您将使用数据库Json根目录下的结构。它的唯一子项是
Posts

当你这样做的时候

let postUpdates = ["\(post.likes)": newLikes]
database.updateChildValues(postUpdates)
您正在尝试更新根节点下的值,而根节点显然不存在。它能找到的唯一参考是键
Posts

为了在正确的位置执行更新,您可以从主引用中获取子引用,尤其是您感兴趣更新的帖子的子引用

例如,您可以执行以下操作:

let postReference = database.child("Here goes the post Id").
["key that you want to update": new value]
let postUpdates = ["likes": newLikes]
然后,您将能够在这个新引用上正确使用
updateChildValues
,因为它将更新特定的帖子

另一个可能使用错误的是发送到
updateChildValues
的字典。您必须提供的词典结构如下:

let postReference = database.child("Here goes the post Id").
["key that you want to update": new value]
let postUpdates = ["likes": newLikes]
因此,在您的情况下,您不应提供以前的like计数和新的like计数,而应提供一个字典,如下所示:

let postReference = database.child("Here goes the post Id").
["key that you want to update": new value]
let postUpdates = ["likes": newLikes]

您的数据库引用有问题。当您执行
let database=FIRDatabase.database().reference()
时,您将引用数据库结构中的主节点。这意味着您将使用数据库Json根目录下的结构。它的唯一子项是
Posts

当你这样做的时候

let postUpdates = ["\(post.likes)": newLikes]
database.updateChildValues(postUpdates)
您正在尝试更新根节点下的值,而根节点显然不存在。它能找到的唯一参考是键
Posts

为了在正确的位置执行更新,您可以从主引用中获取子引用,尤其是您感兴趣更新的帖子的子引用

例如,您可以执行以下操作:

let postReference = database.child("Here goes the post Id").
["key that you want to update": new value]
let postUpdates = ["likes": newLikes]
然后,您将能够在这个新引用上正确使用
updateChildValues
,因为它将更新特定的帖子

另一个可能使用错误的是发送到
updateChildValues
的字典。您必须提供的词典结构如下:

let postReference = database.child("Here goes the post Id").
["key that you want to update": new value]
let postUpdates = ["likes": newLikes]
因此,在您的情况下,您不应提供以前的like计数和新的like计数,而应提供一个字典,如下所示:

let postReference = database.child("Here goes the post Id").
["key that you want to update": new value]
let postUpdates = ["likes": newLikes]


双击后,firebase数据库中是否有关于
post.likes
的更新?没有,只是什么都没有发生。请确认,您能否显示您的数据库结构,以及如何声明变量
数据库
?我的意思是,请将其添加到您的问题中。确实如此。在双击后,firebase数据库中是否有关于
帖子的更新。likes
?不,根本没有发生任何事情?请查看您的数据库结构,以及如何声明变量
数据库
?我的意思是,请将它添加到您的问题中。当然,这样做了。好的,谢谢,这很有意义,但是我如何获得所选单元格的
postID
?不客气!好吧,我想你正在从firebase数据库中获取你在tableView中显示的帖子,不是吗?然后,您还应该将firebase返回的对象中的
Id
保存到您的
post
结构中。我看不到你的代码中你是如何创建/检索帖子的。我添加了我是如何创建和检索数据的——现在我正在努力将
autoID
添加到
post
中,你有什么问题?无法访问id?好的,终于找到了!谢谢你的帮助!好的,谢谢,这是有道理的,但是我如何获得所选单元格的
postID
?不客气!好吧,我想你正在从firebase数据库中获取你在tableView中显示的帖子,不是吗?然后,您还应该将firebase返回的对象中的
Id
保存到您的
post
结构中。我看不到你的代码中你是如何创建/检索帖子的。我添加了我是如何创建和检索数据的——现在我正在努力将
autoID
添加到
post
中,你有什么问题?无法访问id?好的,终于找到了!谢谢你的帮助!