在Swift 3中,我通过json从api获取数据并检查我的自定义单元格中是否喜欢帖子:
let cell = self.tableView.dequeueReusableCell(withIdentifier: "Feedcell", for: indexPath) as! FruitTableViewCell
//getting the hero for the specified position
let hero: List_Feed
hero = heroes[indexPath.row]
if(hero.mylike=="liked"){
cell.btnLike.setImage(UIImage(named: "liked"), for: .normal)
cell.btnLike.addTarget(self, action:#selector(handleDislikes(sender:)), for: .touchUpInside)
}else{
cell.btnLike.setImage(UIImage(named: "unliked"), for: .normal)
cell.btnLike.addTarget(self, action:#selector(handleLikes(sender:)), for: .touchUpInside)
}
这里是handleDislikes和handleLikes函数:
func handleLikes(sender: AnyObject) {
let likeid = sender.tag / 100
let row = sender.tag % 100
print(likeid)
print(row)
let m1 = sender.titleLabel??.text
let m2 = Int(m1!)
let m3 = m2!+1
let m4 = String(m3)
sender.setTitle(m4, for: .normal)
sender.setImage(UIImage(named: "liked"), for: .normal)
sender.removeTarget(nil, action: nil, for: .allEvents)
sender.addTarget(self, action:#selector(handleDislikes(sender:)), for: .touchUpInside)
}
func handleDislikes(sender: AnyObject) {
let likeid = sender.tag / 100
let row = sender.tag % 100
print(likeid)
print(row)
let m1 = sender.titleLabel??.text
let m2 = Int(m1!)
let m3 = m2!-1
let m4 = String(m3)
sender.setTitle(m4, for: .normal)
sender.setImage(UIImage(named: "unliked"), for: .normal)
sender.removeTarget(nil, action: nil, for: .allEvents)
sender.addTarget(self, action:#selector(handleLikes(sender:)), for: .touchUpInside)
}
所以当我按下“喜欢它”按钮时,按钮的值变为值+ 1。然后,当我向下滚动并再次向上滚动到此喜欢的帖子(自定义单元格)时,它会显示按钮未按下。为什么呢,我的朋友们?
答案 0 :(得分:1)
您遇到的行为来自iOS处理单元格的方式。为了避免在单元格滚出视图时取消分配和重新分配内存,而其他人在iOS中滚动重新使用超出范围的UITableViewCell
s实例;所以你不能依赖于一个单元格会保存一些数据的事实,因为当再次显示同一个单元格时,它可能会显示一个不同的UITableViewCell
实例。
正如@rmaddy在评论中指出的那样,你必须在heroes
变量中保存喜欢的数量,这样才能在下次调用tableView(_,cellForRowAtIndexPath:_)
时正确显示。