Swift / Firebase从tableview更改值

时间:2016-05-15 19:28:58

标签: swift firebase tableview firebase-realtime-database

基本上我在尝试在tableview中更改Firebase的值时遇到了一些困难。我目前正在尝试制作类似Facebook的帖子,让人们喜欢你的帖子。但是,我不太清楚如何继续这样做。我想让用户能够喜欢每个帖子,然后保存以前的喜欢+给出的喜欢,并在firebase中更新它。截至目前,我只有显示每个帖子的代码,还有按钮的@IBAction(Like按钮)。

我不确定如何使用indexPath.row(?)仅通过表视图访问每个特定帖子。这是我到目前为止的代码:

发布编辑:

所以基本上我有一个tableview,包含一个表格视图单元格,显示每个帖子的喜欢数量。为此,我在viewDidLoad()中使用此代码,只是从Firebase获取数据:

ref.childByAppendingPath("posts").queryOrderedByChild("timeRegistered").observeEventType(FEventType.ChildAdded) { (snapshot:FDataSnapshot!) in

        var dict = [String:String]()
        dict["keys"] = snapshot.key as? String
        dict["votes"] = snapshot.value["likes"] as? String
        self.posts.append(dict)

        self.tableView.reloadData()


    }

请注意,此代码可以在cellForRowAtIndexPath中使用此代码:cell.textLabel!.text = String(posts[indexPath.row]["names"]!)

但是,我认为我在viewDidLoad(.ChildAdded函数)中使用的代码也适用于ChildChanged,所以这就是我提出的:

ref.childByAppendingPath("posts").queryOrderedByChild("timeRegistered").observeEventType(FEventType.ChildChanged) { (snapshot:FDataSnapshot!) in

        var dict = [String:String]()
        dict["keys"] = snapshot.key as? String
        dict["votes"] = snapshot.value["votes"] as? String
        self.posts.append(dict)

        self.tableView.reloadData()


    }

不幸的是,看起来tableview只显示新值(从IBAction更改的值,我也提供此代码。) - 旧值只是保留在那里。这是改变价值的代码:

var key = posts[1]["keys"]
    ref.childByAppendingPath("posts").childByAppendingPath(key!).updateChildValues(["name":"Test name"])
    tableView.reloadData()

仍然试图通过索引找出更改确切值的更好方法 - 但现在情况并非如此(因此发帖[1] ["键"])。你似乎明白问题是什么吗?

总结一下:我想点击一个表格视图单元格中的一个按钮,然后在特定的帖子中添加一个按钮,并实时更新总计数。

1 个答案:

答案 0 :(得分:3)

有多个答案,所以这里有几点:

ChildChanged事件是一个问题。更改子项时,您的代码会将其附加到数组中,从而创建具有不同数据的重复子项。您应该做的是确定它是哪个子节点,从数组中获取该字典并使用新值更新值。

后续评论询问'你是如何做到这一点的。

根据您希望如何存储数据,有多种方法可以实现。我将举两个例子:

假设您有一个Post结构(对象),其中包含有关每个帖子的信息。这是比使用词典更好的解决方案。该结构将包含firebase密钥,msg和发布帖子的用户的uid,并将这些帖子存储在postsArray中

struct Post {
    var firebaseKey : String?
    var msg: String?
    var uid: String?

    init(aFirebaseKey: String, aMsg: String, aUid: String ) {
        self.firebaseKey = aFirebaseKey
        self.msg = aMsg
        self.uid = aUid
    }
}

var postsArray = [Post]()

并假设您正在观察posts节点的更改:

postsRef.observeEventType(.ChildChanged, withBlock: { snapshot in
  let changedKey = snapshot.key //the firebase key
  if let index = self.postsArray.indexOf({$0.firebaseKey == changedKey}) {
    print(index) //index is the index of the Post in the array
    let changedPost = self.postsArray[index]
    //update the values
    self.tableView.reloadData
}

并使其完成,帖子的初始加载

postsRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
  for child in snapshot.children {

    let theKey = child.key as String
    let theMsg = child.value["msg"] as! String
    let theUid = child.value["user"] as! String

    let p = Post(aFirebaseKey: theKey, aMsg: theMsg, aUid: theUid)

    self.postsArray.append(p)              
  }
})

另一种选择是保持并排阵列。

keysArray[String]()
valuesArray[Dictionary]()

使用类似的代码,在childChanged事件中获取firebase密钥,然后在keysArray中找到该密钥,该密钥将返回它的索引。然后使用返回的索引从valuesArray中获取值;更新它们并重新加载表格。

let index= keysArray.indexOf(firebaseKey) //get the index for this post

let postToUpdate = self.valuesArray[index]
//update the Post

当然,在最初加载数组时,您将键放在keysArray中,并将值放在valuesArray中