我有问题。当我点击按钮时,类似的计数刷新了喜欢的数量,但当我滚动UITableView
并返回帖子时,likecount
返回到前一个值。示例:我有1个喜欢,我点击了,likecount
是2,但当我滚动UITableView
并返回帖子时,我又有1个喜欢。为什么呢?
@IBAction func likePressed(_ sender: Any) {
self.like.isEnabled = false
let ref = Database.database().reference()
let keyPost = ref.child("posts").child(self.postID)
keyPost.observeSingleEvent(of: .value) { (snapshot) in
if let post = snapshot.value as? [String: AnyObject] {
var likes = post["likes"] as! Int
likes = likes+1
let update = ["likes" : likes]
self.likecount.text = "\(likes) Likes"
keyPost.updateChildValues(update)
}
ref.removeAllObservers()
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! PostCell
cell.postID = self.posts[indexPath.row].postID
cell.likecount.text! = "\(self.posts[indexPath.row].likes!) Likes"
cell.postImage.sd_setImage(with: URL(string: self.posts[indexPath.row].pathToImage), placeholderImage: UIImage(named: "placeholder.png"))
return cell
}
答案 0 :(得分:0)
UITableViewCells是可重用的,因此在滚动时可以非常快速地加载和处理它们。您不能只更新单元格中的值并期望将其存储。
您需要更新为tableView提供信息的数据。因此,当重新加载该特定单元格时,在cellForRowAt
中它可以设置正确的值。
如果要将此信息存储在Firebase中,则可能需要在更新后重新加载数据。显示您的cellForRowAt函数以获得更准确的答案
编辑:
好的,您的问题是,您有一些结果来自self.posts
存储的Firebase,但您使用keyPost.updateChildValues(update)
更新了Firebase版本。无论何时执行此操作,您都需要使用更新的数据更新self.posts。
答案 1 :(得分:0)
您的细胞被重复使用,因此不要依赖您的局部变量。 相反,在初始化单元格时,您应该有一个传递给单元格的对象。
单元格中的*,创建设置功能
setup(object: whatever) {
self.object = object
self.numberOfLikesLabel.text = object.numberOfLikes
// set whatever other value
}
*在行的单元格中,调用该函数并传递该对象。
修改单元格中的值时,请在对象中设置它们。对象(类)通过引用传递,而不是复制。因此,如果您从单元格中更改它,则还要更改具有tableView的视图控制器中的同一对象。因此,当重新使用单元格并调用您的设置功能时,您可以设置最新值。
编辑:解释更多
说你像这样制作一个对象:
Class whatever {
var numberOfLikes: Int = 0
}
这是一堂课。所以,如果在你的cellForRowAt中你做了
let cell = getmyCell()
cell.setup(object: cellModel)
return cell
您传递的cellModel通过引用传递(通过内存地址)
因此,当您从单元格修改对象的numberOfLikes时,您也会在具有tableview的viewController中更改它。
当然在您的主视图控制器中,您还需要创建您的cellModel并在调用cellForRowAt之前将其存储为类变量
所以当您的单元格重新加载时,会将相同的对象传递给它,并带有更新的值
答案 2 :(得分:0)
更新您的posts[index_value].likes
时更改您想要更新您的喜欢计数的计数。您需要使用更新的数据更新self.posts
。
@IBAction func likePressed(_ sender: Any) {
self.like.isEnabled = false
let ref = Database.database().reference()
let keyPost = ref.child("posts").child(self.postID)
keyPost.observeSingleEvent(of: .value) { (snapshot) in
if let post = snapshot.value as? [String: AnyObject] {
var likes = post["likes"] as! Int
likes = likes+1
let tag = (sender as AnyObject).tag
// tag is an index value for your posts array on which index value u want to update likes count
self.posts[tag].likes = likes
let update = ["likes" : likes]
self.likecount.text = "\(likes) Likes"
keyPost.updateChildValues(update)
}
ref.removeAllObservers()
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! PostCell
cell.postID = self.posts[indexPath.row].postID
cell.likecount.text! = "\(self.posts[indexPath.row].likes!) Likes"
cell.postImage.sd_setImage(with: URL(string: self.posts[indexPath.row].pathToImage), placeholderImage: UIImage(named: "placeholder.png"))
return cell
}
修改:
var likesObj = [Int: String]()
@IBAction func likePressed(_ sender: Any) {
self.like.isEnabled = false
let ref = Database.database().reference()
let keyPost = ref.child("posts").child(self.postID)
keyPost.observeSingleEvent(of: .value) { (snapshot) in
if let post = snapshot.value as? [String: AnyObject] {
var likes = post["likes"] as! Int
likes = likes+1
let tag = (sender as AnyObject).tag
// tag is an index value for your posts array on which index value u want to update likes count
self.likesObj[tag ] = likes
let update = ["likes" : likes]
self.likecount.text = "\(likes) Likes"
keyPost.updateChildValues(update)
}
ref.removeAllObservers()
}
}
在另一个ViewController
self.posts
通过likesObj
并更新self.postes
likes
override func viewDidLoad() {
super.viewDidLoad()
for (key, value) in likesObj{
self.posts[key].value
}
}