我知道这是一个常见错误,并且已经讨论过很多次,但请听我说。我已经阅读了很多这些帖子,但没有一个提到我的具体案例,我自己也无法找到解决方案。
这是我得到的错误:
[Snapshotting] Snapshotting a view (0x7fab10c300b0, _UIReplicantView) that has not been rendered at least once requires afterScreenUpdates:YES.
根据我的观察,每次我开始在 searchController 中搜索时它都会出现。在我看来,当键盘更改时会弹出错误(从大写字母变为小写字母,反之亦然......)。
我试过了:
- 把
.layoutIfNeeded()
我可能的任何地方(tableView、cells、view、searchBar...) - 所有 UI 更改都发生在主线程上
- 玩弄不同的
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)
}
更新 diffable 数据源
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)
}
}
正如我所说,当我将第一个字母放入搜索栏中或将其删除时,错误会准确弹出。否则一切正常。
任何帮助或提示将不胜感激!