Swift/Firebase 从 TableView 更改值

标签 swift firebase tableview firebase-realtime-database

基本上,我在尝试更改 TableView 中来自 Firebase 的值时遇到了一些困难。我目前正在尝试制作一个类似 Facebook 帖子的功能,让人们喜欢你的帖子。但是,我不太确定我将如何进行。我想让用户能够喜欢每个帖子,然后保存以前的喜欢 + 给出的喜欢,并在 firebase 中更新它。截至目前,我只有显示每个帖子的代码,以及来自按钮(“赞”按钮)的@IBAction。

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

后期编辑:

所以基本上我有一个 TableView ,包含一个 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()

仍在尝试找出一种更好的方法来更改确切的值,通过索引 - 但现在情况并非如此(因此 posts[1]["keys"])。您似乎明白问题出在哪里了吗?

总结一下:我想点击表格 View 单元格内的一个按钮,为特定的帖子添加一个赞,并实时更新总数。

最佳答案

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

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

后续评论会问“你是怎么做到的”。

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

假设您有一个 Post 结构(对象),其中包含有关每个帖子的信息。这是比使用字典更好的解决方案。该结构将包含 firebase key 、消息和发帖用户的 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 中获取值;更新它们并重新加载 Tableview。

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

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

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

关于Swift/Firebase 从 TableView 更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37242760/

相关文章:

swift - 参数标签 '(content:)' 与任何可用的重载、swift、vapor、rest invapor、使用 postgresql 都不匹配

javascript - 这是一个数组吗? ( react )

javascript - Firebase 消息传递服务可以作为 websockets/服务器发送事件的可扩展替代品吗?

ios - 如何将@IBAction函数数据获取到TableView中?

ios - UIButton titleLabel 文本位于其框架底部

ios - TableView 不显示整个 tableViewCell(高度)

ios - 如何将 map 缩放到我的注释地标 - Swift

swift - 无法从 Firebase 获取值(value)

iphone - 如何让用户将单元格添加到表格 View 的自定义位置?

ios - 比较数组列表和选定值并根据索引将其显示在表格 View 单元格中