Like 按钮状态未保存

Posted

技术标签:

【中文标题】Like 按钮状态未保存【英文标题】:Like button state not saved 【发布时间】:2018-01-01 17:03:38 【问题描述】:

在 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)

因此,当我点击喜欢按钮时,它“喜欢它”并且按钮的值变为 value+1。然后,当我向下滚动并再次向上滚动到这个喜欢的帖子(自定义单元格)时,它显示 按钮未按下。为什么会这样,我的朋友们?

【问题讨论】:

您的handleLikeshandleDislikes 方法没有任何用处。他们需要更新您的 heroes 数组中的数据。 @mr-jo : 您的 handleLikes 和 handleDislikes 只是暂时反映更改,以便保持更改,您应该修改相应英雄对象的 myLike 属性 @rmaddy 谢谢你的回复!现在我知道该怎么做了。请写下您的评论作为答案。 【参考方案1】:

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

正如@rmaddy 在评论中指出的,您必须将点赞数保存在heroes 变量中,以便在下次调用tableView(_,cellForRowAtIndexPath:_) 时正确显示。

【讨论】:

以上是关于Like 按钮状态未保存的主要内容,如果未能解决你的问题,请参考以下文章

Laravel / AJAX Like 按钮错误:请求失败,状态码 404

NSUser Defaults 保存按钮状态并再次显示

UITableView 的单元格中的 iOS Swift Like 按钮

facebook发送按钮返回状态码200

小部件未保存的单选按钮

保存 iOS 应用场景状态