Ошибка при поиске в новом UITableViewDiffableDataSource [Snapshotting] - PullRequest
0 голосов
/ 04 мая 2020

Я знаю, что это распространенная ошибка и много раз обсуждалась, но выслушайте меня. Я прочитал ОЧЕНЬ много этих постов, и ни в одном из них не упоминается мой конкретный случай c, и я не смог сам найти решение.

Это ошибка, которую я получаю:

[Snapshotting] Snapshotting a view (0x7fab10c300b0, _UIReplicantView) that has not been rendered at least once requires afterScreenUpdates:YES.

По моим наблюдениям, оно появляется каждый раз, когда я начинаю поиск в searchController . Мне кажется, что ошибка появляется при смене клавиатуры (с заглавных букв на мелкие, наоборот ...).

Я пробовал:

  • размещение .layoutIfNeeded() везде, где только возможно (tableView, ячейки, view, searchBar ...)
  • все изменения пользовательского интерфейса происходят в главном потоке
  • игра с разными searchController.searchBar.searchTextField.becomeFirstResponder()

Излишне говорить, что ни один из вышеперечисленных не решил мою проблему.

Вот мой код для поиска:

func updateSearchResults(for searchController: UISearchController) {
        let added = DBManager.shared.getAddedCurrencies()
        DispatchQueue.main.async { searchController.searchBar.searchTextField.becomeFirstResponder() }
        guard let filter = searchController.searchBar.text, !filter.isEmpty else {
            filtering = false
            filtered = []
            updateDiffable(with: added)
            return
        }
        filtering = true
        filtered = added.filter({ (currency) -> Bool in
            return currency.name.lowercased().contains(filter.lowercased()) || currency.code.lowercased().contains(filter.lowercased())
        })

        updateDiffable(with: filtered)

    }

Обновление диффузного источника данных

func updateDiffable(with list: [Currency], animate: Bool = true) {
        var snapshot = NSDiffableDataSourceSnapshot<Section, Currency>()
        snapshot.appendSections([.main])
        snapshot.appendItems(list)

        DispatchQueue.main.async {
            self.diffableDataSource.apply(snapshot, animatingDifferences: animate)
        }
    }

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

Любая помощь или советы будут высоко оценены!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...