Поддержание состояния UITableViewCell между прокруткой - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть UITableViewCell, в котором есть кнопка и общее количество лайков count.

Когда пользователь нажимает, выполняется вызов API ичисло увеличивается на бэкэнде, и этот конкретный объект устанавливается как liked.

Если пользователь снова нажимает на него, процесс повторяется, за исключением того, что счетчик уменьшается и флаг liked не устанавливается.

В настоящее время я обнаруживаю, что когда моя ячейка прокручивается с экрана, счетчик сбрасывается.Это имеет смысл, если мое понимание UITableViewCell правильное.

Я бы хотел избежать повторного извлечения всего табличного представления при каждом нажатии, поэтому я надеялся, что смогу поддерживать какое-то локальное состояниенепривлекательные предметы.

Я не могу понять, как наилучшим образом сбалансировать логику между способностью управлять реальными счетами и моими локальными счетами.

Чтобы сделать вопросы, возможно, более сложными, существуетвеб-приложение, которое использует те же API-интерфейсы, поэтому мне нужно убедиться, что я очищаю этот локальный кеш каждый раз, когда обновляется UITableView.

У меня есть static prop на 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 голосов
/ 15 февраля 2019

Предполагается, что у вас есть массив моделей, затем добавьте его к модели.

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

. Приведенные выше 2 свойства должны иметь значение при получении запроса, когда вы нажимаете "нравится" или "не нравится" в ячейке.Инициируйте запрос API с правильными параметрами, указав ссылку на indexPath ячейки, если вам нравится

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` 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...