代码之家  ›  专栏  ›  技术社区  ›  user1591668

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

  •  0
  • user1591668  · 技术社区  · 6 年前

    我有一个表视图,它有一个特别喜欢和不同的帖子功能。我的问题是,如果你喜欢一个帖子,它显示正确,但如果你向下滚动,然后向上滚动,它就会忘记。我怎么解决这个问题?

    @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)
        }
    }
    

    上面的代码只检查您是否喜欢某个东西,如果喜欢,单击它会将+1添加到计数中,并将图像更改为“喜欢”。如果您与某个不同,那么它会在计数器上执行-1并将图像更改为默认值。一切都正常。我唯一的问题是,如果我向下滚动然后向后滚动,就会忘记我喜欢什么。我唯一能解决这个问题的方法就是打电话 tableView.reloadData() . 但是,这太多了,因为我只更新了一个单元格。有什么建议吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Jigar    6 年前

    您还需要更改模型数组中的值,否则当您滚动TableView时,会得到旧值。请尝试此代码。

    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)
            }
    
        2
  •  2
  •   caffieneToCode    6 年前

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

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

    注意:此方法接受一个索引路径数组,如果只需要重新加载一个单元格,则需要在数组中传递该索引路径。

    此外,间歇性的相似/不同问题在可重复使用的单元中非常常见。您需要单独维护该选择,以便仅在所选单元格上适当地显示“相似”。如果我对你到底在做什么有更多的了解,我可以给你一个确切的答案。

        3
  •  1
  •   Abhishek Jadhav    6 年前

    将此代码置于votebutton操作中,然后重新加载特定单元格。

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