无法重用UITableViewCells

时间:2017-11-22 11:30:14

标签: ios swift uitableview

当我运行下面的代码时,它有时会对其他单元格进行更改而不是实际的单元格。它设置来自另一个帖子的投票。 知道为什么吗?

显示/隐藏投票视图只是 votesView.isHidden = true / false 启用/禁用对于按钮,Btns只是 btns.isEnabled = true / false 。 如果这些都可以正常工作。

这是我的PostCell代码:

override func awakeFromNib() {
    super.awakeFromNib()

    hideVoteViews()


    let ref = DataService.ds.REF_USER_CURRENT
    let likeRef = ref.child("likes")

    likeRef.observeSingleEvent(of: .value) { (snapshot) in
        if snapshot.hasChild(self.post.postKey){
            self.setVotesLbl()
            self.showVoteViews()
            self.disableBtns()
        } else {
            self.hideVoteViews()
            self.enableBtns()
        }
    }

}

setVotesLbl函数:

 func setVotesLbl(){
    if let votes = self.post?.altAVotes{
        self.altAVotesLbl.text = "\(votes)"
    }
    if let votes = self.post?.altBVotes{
        self.altBVotesLbl.text = "\(votes)"
    }
    if let votes = self.post?.altCVotes{
        self.altCVotesLbl.text = "\(votes)"
    }
    if let votes = self.post?.altDVotes{
        self.altDVotesLbl.text = "\(votes)"
    }
}

4 个答案:

答案 0 :(得分:1)

从nib中唤醒单元格时,不应设置观察者。因为虽然重新使用来自PostCell的awakefromnib的单元格不会被调用,因此旧单元格的数据将反映到您重用的单元格中。 更好的方法是将观察者设置为你的喜欢"喜欢"根节点并将值存储在您的数据结构中。之后,您可以使用此数据结构重新加载表。

答案 1 :(得分:1)

由于UITableview的重用性,PostCell的“awakeFromNib()”每次都不会调用“func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell”。为此,您必须致电:

func getCellData()
{
    hideVoteViews()
    let ref = DataService.ds.REF_USER_CURRENT
    let likeRef = ref.child("likes")

    likeRef.observeSingleEvent(of: .value) { (snapshot) in
        if snapshot.hasChild(self.post.postKey){
            self.setVotesLbl()
            self.showVoteViews()
            self.disableBtns()
        } else {
            self.hideVoteViews()
            self.enableBtns()
        }
    }
}

in:

override func prepareForReuse() {
super.prepareForReuse()
hideVoteViews()
getCellData()

}

以及:

    override func awakeFromNib() {
    super.awakeFromNib()
    hideVoteViews()
    getCellData()
}

我希望这能解决问题:)

答案 2 :(得分:0)

您应该设置所有标签的文字,否则以前的文字会被重复使用。

您还应该使用NumberFormatter将数值转换为数字,而不是从中创建字符串文字。

let formatter = NumberFormatter()

if let aVotes = post?.altAVotes {
    altAVotesLbl.text = formatter.string(from: aVotes as NSNumber)
} else {
    altAVotesLbl.text = ""
}

[...]

答案 3 :(得分:0)

首先,您需要在 cellForRowAtIndexPath 中自定义您的单元格,而不是在awakeFromNib中。

其次,您需要在重写prepareForReuse 重复使用单元格之前重置标签和视图。

 override func prepareForReuse() {
    super.prepareForReuse()
    hideVoteViews()
    self.altAVotesLbl.text = ""
}