像按钮状态没有保存

时间:2018-01-01 17:03:39

标签: ios swift

在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。然后,当我向下滚动并再次向上滚动到此喜欢的帖子(自定义单元格)时,它会显示按钮未按下。为什么呢,我的朋友们?

1 个答案:

答案 0 :(得分:1)

您遇到的行为来自iOS处理单元格的方式。为了避免在单元格滚出视图时取消分配和重新分配内存,而其他人在iOS中滚动重新使用超出范围的UITableViewCell s实例;所以你不能依赖于一个单元格会保存一些数据的事实,因为当再次显示同一个单元格时,它可能会显示一个不同的UITableViewCell实例。

正如@rmaddy在评论中指出的那样,你必须在heroes变量中保存喜欢的数量,这样才能在下次调用tableView(_,cellForRowAtIndexPath:_)时正确显示。