LikeButton UITableView

时间:2018-06-14 20:42:23

标签: ios swift uitableview

我有问题。当我点击按钮时,类似的计数刷新了喜欢的数量,但当我滚动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
}

3 个答案:

答案 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
        }
    }