Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 重用UITableViewCells时出现问题_Ios_Swift_Uitableview - Fatal编程技术网

Ios 重用UITableViewCells时出现问题

Ios 重用UITableViewCells时出现问题,ios,swift,uitableview,Ios,Swift,Uitableview,当我运行下面的代码时,它有时会对其他单元格进行更改,而不是它实际用于的单元格。它设置来自另一个职位的投票。 知道为什么吗 显示/隐藏VoteView仅为视图的VoteView.isHidden=true/false 启用/禁用BTN只是BTN。对于按钮,isEnabled=true/false。 如果这两种方法都有效的话 这是我的邮政编码: override func awakeFromNib() { super.awakeFromNib() hideVoteViews()

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

显示/隐藏VoteView仅为视图的VoteView.isHidden=true/false 启用/禁用BTN只是BTN。对于按钮,isEnabled=true/false。 如果这两种方法都有效的话

这是我的邮政编码:

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)"
    }
}

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

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

let formatter = NumberFormatter()

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

[...]

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

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

let formatter = NumberFormatter()

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

[...]

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

其次,您需要重置标签和视图,然后才能通过重写prepareforeuse重新使用单元格

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

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

其次,您需要重置标签和视图,然后才能通过重写prepareforeuse重新使用单元格

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

从nib唤醒单元格时不应设置观察者。因为在重用单元时,不会调用PostCell的NIB唤醒,因此旧单元的数据将反映到重用的单元中。
更好的方法是将观察者设置为“likes”根节点,并将值存储在数据结构中。之后,可以使用此数据结构重新加载表。

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

因为PostCell的UITableview“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()
        }
    }
}
在:

}

以及:

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

我希望这将解决问题:)

因为PostCell的UITableview“awakeFromNib()”的可重用性不会每次都为“func tableView(u 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()
        }
    }
}
在:

}

以及:

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

我希望这能解决问题:)

不要在视图中运行应该属于控制器或模型的代码。请改为在视图控制器中更新
cellforrowatinexpath
中的标签。请查看我接受的答案。它工作得很好,但是,所有建议在CellForRowatineXpath中运行代码的人都让我不确定这是否是正确的方法。只是不要在应该属于控制器或模型的视图中运行代码。请改为在视图控制器中更新
CellForRowatineXpath
中的标签。请看一看我接受的答案。它工作得很好,但你们所有人都建议在CellForRowatineXpath中运行代码,这让我不确定这是否是正确的方法。这工作得很好!我看到一些答案建议我应该在cellForRowAtIndexPath中设置标签。你知道为什么吗?这些答案是针对可重用性问题的,但在你的例子中,firebase数据和可重用性都会影响tableview单元格。这非常有效!我看到一些答案建议我应该在cellForRowAtIndexPath中设置标签。你知道为什么吗?这些答案是针对可重用性问题的,但在你的例子中,firebase数据和可重用性都会影响tableview单元格。你能看看我接受的答案吗?为什么我要自定义CellForRowatineXpath中的单元格,而不是答案中的代码?我真的不确定,你能看看我接受的答案吗?为什么我要自定义CellForRowatineXpath中的单元格,而不是答案中的代码?我真的不确定。。