gpt4 book ai didi

Swift/Firebase 从 TableView 更改值

转载 作者:搜寻专家 更新时间:2023-11-01 06:39:31 24 4
gpt4 key购买 nike

基本上,我在尝试更改 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com