iOS Swift如何更改1个表格视图单元格

时间:2018-07-31 04:18:20

标签: ios swift uitableview

我有一个表格视图,上面有喜欢和不喜欢特定帖子的功能。我的问题是,如果您喜欢某个帖子,它会正确显示,但是如果您向下滚动然后向上滚动,则会忘记。我该怎么解决?

@IBAction func voteAction(_ sender: UIButton)
{
    let stream_id = streamsModel.streamID[sender.tag]
    let profile_id = streamsModel.Profile_ID[sender.tag]
    streamsModel.voteStatusv = streamsModel.VoteStatus[sender.tag]
    streamsModel.Likes = streamsModel.Votes[sender.tag]
    streamsModel.streamIDv = streamsModel.streamID[sender.tag]

    let cellT = getCellForView(view: sender)
    let indexPath = TableSource.indexPath(for: cellT!)

    if (indexPath != nil) {
        let cell = TableSource.cellForRow(at: indexPath!) as! HomeTVC
        if streamsModel.likeStatus == "0"   {
            // Liked
            cell.votes.setTitle(String(streamsModel.Likes+1), for: UIControlState.normal)
            cell.likeImage.setImage(UIImage(named: "like2"), for:  .normal)
        } else {
            // Unliked
            cell.votes.setTitle(String(streamsModel.Likes-1), for: UIControlState.normal)
            cell.likeImage.setImage(UIImage(named: "like"), for:  .normal)
        }
        // This snippet below causes an error
        //TableSource.reloadRows(at: [indexPath!], with: .none)
    }
}

上面的代码只是检查您是否喜欢onClick,如果是,它将为计数增加+1并将图像更改为like。如果您不喜欢某些东西,则它将在计数器上执行-1并将图像更改为默认图像。同样,一切正常。我唯一的问题是,如果我向下滚动然后向上备份,则会忘记我喜欢的东西。解决此问题的唯一方法是调用tableView.reloadData()。但是,这太多了,因为我只更新1个单元格。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

您还需要更改模型数组中的值,否则在滚动表视图时会获得旧值。尝试此代码

if (indexPath != nil) {
            let cell = TableSource.cellForRow(at: indexPath!) as! HomeTVC
            if streamsModel.likeStatus == "0"   {
                // Liked
                streamsModel.Likes = streamsModel.Votes[sender.tag] + 1
                cell.votes.setTitle(String(streamsModel.Likes+1), for: UIControlState.normal)
                cell.likeImage.setImage(UIImage(named: "like2"), for:  .normal)
            } else {
                // Unliked
                streamsModel.Likes = streamsModel.Votes[sender.tag] - 1
                cell.votes.setTitle(String(streamsModel.Likes-1), for: UIControlState.normal)
                cell.likeImage.setImage(UIImage(named: "like"), for:  .normal)
            }
            // This snippet below causes an error
            //TableSource.reloadRows(at: [indexPath!], with: .none)
        }

答案 1 :(得分:2)

您可以使用reloadRows(at:with :)方法

tableView.reloadRows(at: [IndexPath], with: UITableViewRowAnimation)

注意:此方法接受一个I​​ndexPath数组,如果您只需要重新加载单个单元格,则需要在数组中传递该IndexPath。

此外,间歇性的/不相同的问题在可重复使用的单元格中很常见。您需要单独维护该选择,以仅在选定的单元格上适当显示。如果我对您的工作有更多的了解,我可能会为您提供确切的解决方案。

答案 2 :(得分:1)

将这段代码放入表决按钮的操作中,然后重新加载特定的单元格。

let indexPath = IndexPath(item: sender.tag, section: 0)
tableView.reloadRows(at: [indexPath], with: .none)