【问题标题】:Swift/Firebase change value from tableview表视图中的 Swift/Firebase 更改值
【发布时间】:2016-05-15 19:28:57
【问题描述】:

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

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

后期编辑:

所以基本上我有一个表格视图,其中包含一个表格视图单元格,显示每个帖子的点赞数量。为此,我在 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] [“keys”])。你似乎明白问题所在了吗?

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

【问题讨论】:

  • 有点不清楚你想做什么;还有,界面是什么? “投票”和“喜欢”是一回事吗?一个简单的解决方案是在每一行上添加一个小 + 按钮,当用户单击 + 时,会增加投票/喜欢。您可以通过 clickedRow 知道它是哪一行,或者可能有处理点击的自定义单元格。
  • 所以基本上我想添加“喜欢”功能,你可以称之为 - 我希望它在按下“喜欢”后立即更新记录(旧喜欢+1 新喜欢)。
  • 我想是的...不要把它复杂化。只需有一个响应单击 + 按钮的 IBAction。确定点击了哪一行,然后从您的帖子数组中获取当前点赞数[clickedRow],增加点赞数,然后通过该行的 firebase 键和子节点 likes.setValue(votes) 更新 Firebase 中的值。
  • @Jay 这基本上就是我想要实现的目标。但是,我正在努力更新表格视图中的值。我正在尝试使用 Firebase ChildChanged 函数更新此数据,如下所示:ref.childByAppendingPath("names").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() }
  • @Jay 问题似乎在于,旧值仍然显示,而新值显示在新的表格视图单元格中。你知道我怎样才能避免这种情况吗?

标签: swift firebase tableview firebase-realtime-database


【解决方案1】:

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

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

后续 cmets 询问“你是如何做到的”。

根据您想要存储数据的方式,有多种方法可以访问它。我举两个例子:

假设您有一个包含每个帖子信息的帖子结构(对象)。这是比使用字典更好的解决方案。该结构将包含发帖用户的 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]()

假设您正在观察帖子节点的变化:

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中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多