滚动之间保持UITableViewCell状态

时间:2019-02-15 16:29:15

标签: ios swift uitableview

我有一个UITableViewCell,其中有一个喜欢按钮和总喜欢个计数。

用户点击时,将进行API调用,并且后端上的数字将递增,并且该特定对象将被设置为liked

如果用户再次点击它,则重复该过程,除了计数递减并且未设置liked标志之外。

我当前正在发现,当我的单元格滚动出屏幕时,计数将重置。如果我对UITableViewCell的理解是正确的,这是有道理的。

我希望避免在每次点击时再次获取整个表格视图,因此我希望可以保持某种不喜欢/喜欢的物品的本地状态。

我无法弄清楚如何在能够管理实际计数与本地计数之间的逻辑之间取得最佳平衡。

为了使事情变得更复杂,有一个Web应用程序使用相同的api,因此我需要确保每次刷新UITableView时都清理此本地缓存。

我在static上有一个BaseRecognitionFeedCell道具,看起来像:

static var localLikes = [String: Int]()

还有我类中的一个方法,当点击图标时会调用该方法:

@objc private func handleTapLikeButton() -> Void {
    guard let content = content, let externalId = content.externalId else { return }

    if BaseRecognitionFeedCell.localLikes[externalId] == nil {
        var likes: Int
        if !content.liked {
            didLikeFeedItem?(content.type, externalId)
            likes = content.likes + 1
        } else {
            // call didDislikeBinding
            likes = content.likes - 1
        }

        BaseRecognitionFeedCell.localLikes[externalId] = likes
        likeRecognitionButton.setTitle("\(likes)", for: .normal)
    } else {
        var likes: Int
        if content.likes < BaseRecognitionFeedCell.localLikes[externalId] {
            didLikeFeedItem?(content.type, externalId)
            likes = BaseRecognitionFeedCell.localLikes[externalId] + 1
        } else {
            // call didDislikeBinding
            likes = BaseRecognitionFeedCell.localLikes[externalId] - 1
        }

        BaseRecognitionFeedCell.localLikes[externalId] = likes
        likeRecognitionButton.setTitle("\(likes)", for: .normal)
    }
}

我确信必须有一种方法可以做到,而我只是想念一些东西。

当前计数增加,但是在滚动时它会重置。另外,一旦单击,再次单击它不会减小该值。

1 个答案:

答案 0 :(得分:1)

假设您有一个模型数组,然后将其添加到模型中

var numOfLikes:Int
var isLiked:Bool  /// for me

上述2个属性在接收到请求后必须具有一个值,当您在单元格初始化中单击“喜欢/不喜欢”时,请使用适当的参数(如果喜欢的话,请提供对单元格indexPath的引用)给api请求

model[cellIndex].numOfLikes += 1
model[cellIndex].isLiked = true

如果不喜欢

model[cellIndex].numOfLikes -= 1
model[cellIndex].isLiked = false

此更新需要直接反映到模型中而不是直接反映到单元格中,因为它已在cellForRowAt中出队,请重新分配值,然后在收到响应时刷新单元格

// here update the model 
if let cell = tableView.cellForRow(at:IndexPath(row:lastClickedIndex,section:0)) as? MYCellName {
  // here cell is visible refresh it  
} 
else { 
// don't do anything as the cell isn't here meaning that it will refresh with latest content when re-appear with the automatic call to `cellForRowAt` 
}