Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IOS Swift如何更改1个表格视图单元格_Ios_Swift_Uitableview - Fatal编程技术网

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

IOS Swift如何更改1个表格视图单元格,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个tableview,它有自己喜欢的功能,也有自己不喜欢的功能。我的问题是,如果你喜欢一篇文章,它会正确显示,但如果你向下滚动,然后向上滚动,它就会忘记。我怎样才能解决这个问题 @IBAction func voteAction(_ sender: UIButton) { let stream_id = streamsModel.streamID[sender.tag] let profile_id = streamsModel.Profile_ID[sender.tag]

我有一个tableview,它有自己喜欢的功能,也有自己不喜欢的功能。我的问题是,如果你喜欢一篇文章,它会正确显示,但如果你向下滚动,然后向上滚动,它就会忘记。我怎样才能解决这个问题

@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,并将图像更改为“喜欢”。如果你不喜欢某个东西,那么它会在计数器上执行-1并将图像更改为默认值。同样,一切正常。我唯一的问题是,如果我向下滚动然后备份,它会忘记我喜欢的东西。解决此问题的唯一方法是调用
tableView.reloadData()
。但是,这太多了,因为我只更新了1个单元格。有什么建议吗?

您还需要更改模型数组中的值,否则当您滚动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)
        }

您还需要更改模型数组中的值,否则在滚动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)
        }

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

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

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

let indexPath = IndexPath(item: sender.tag, section: 0)
tableView.reloadRows(at: [indexPath], with: .none)
您可以使用reloadRows(at:with:)方法

注意:这个方法接受一个IndexPath数组,如果只需要重新加载一个单元格,那么需要在数组中传递该IndexPath

此外,间歇性的相似/不相似问题在可重用单元中非常常见。您需要单独维护该选择,以便仅在所选单元格上适当地显示like。如果我能更深入地了解您到底在做什么,我可能会给您一个确切的解决方案。

您可以使用重载行(at:with:)方法

注意:这个方法接受一个IndexPath数组,如果只需要重新加载一个单元格,那么需要在数组中传递该IndexPath


此外,间歇性的相似/不相似问题在可重用单元中非常常见。您需要单独维护该选择,以便仅在所选单元格上适当地显示like。如果我对您的具体操作有更深入的了解,我可能会给您一个确切的解决方案。

您应该在
cellForRowAt
方法中维护liked标志作为索引并对其进行配置?它是在视图控制器中还是在自定义单元格类中?正确的解决方案是更新数据模型,而不是单元。然后告诉表视图重新加载这一行。它位于视图控制器中。是的,我计划更新数据模型,只是想看看是否有可能在action方法中进行更新。我将尝试在cellForRowAt中对其进行配置。您应该将liked标志维护为索引,并在
cellForRowAt
期间对其进行配置,该
voteAction
方法在哪里?它是在视图控制器中还是在自定义单元格类中?正确的解决方案是更新数据模型,而不是单元。然后告诉表视图重新加载这一行。它位于视图控制器中。是的,我计划更新数据模型,只是想看看是否有可能在action方法中进行更新。我将尝试在cellForRowAt中配置它。不要在此处获取单元格。只需更新模型,然后为一个索引路径调用
reloadRows(at
cellForRow
将根据需要更新单元格。不要在此处获取单元格。只需更新模型,然后为一个索引路径调用
reloadRows(at
cellForRow
将根据需要更新单元格。