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