Выбор IndexPath для UITableView, поддерживаемого UITableViewDiffableDataSource

Я пытаюсь выбрать индексы в UITableView с помощью UITableViewDiffableDataSource. Идея состоит в том, чтобы использовать indexPath(for itemIdentifier: ItemIdentifierType)чтобы найти indexPaths для выбора. Но моя проблема в том, что indexPath()ничего не находит, если ТО ЖЕ экземпляр ItemIdentifierType не передан и не был уже добавлен в DataSource. Это означает, что если вы обновили элементы из обновления API, а затем попытались найти indexPath, используя сохраненные элементы, он ничего не найдет. Идентичность объекта, выраженная в Hashable, не кажется здесь единственным фактором.

class PersonModel: Hashable {
    var identifier: String?

    func hash(into hasher: inout Hasher) {
        hasher.combine(identifier)
    }
    static func == (lhs: PersonModel, rhs: PersonModel) -> Bool {
        return lhs.identifier == rhs.identifier
    }
}

class ViewController: UIViewController {

    var diffableData: UITableViewDiffableDataSource<String, PersonModel>? = ...

    func selectIndices() {
        var snapshot = NSDiffableDataSourceSnapshot<String, PersonModel>()
        snapshot.appendSections(["Section"])

        var remotePerson: PersonModel = ... // get from API
        snapshot.appendItems([remotePerson], toSection: "Section")
        diffableData?.apply(snapshot)

        var storedPerson: PersonModel = ... // get from storage, identifier matches remotePerson's
        let indexToSelect = diffableData?.indexPath(for: storedPerson) // not working!
    }
}

Какой разумный способ найти индекс для выбора? Поведение, которое я хочу, похоже, работает, если PersonModel была структурой, но я не хочу использовать структуры.

0 ответов

Другие вопросы по тегам