Пока я обновлял свой проект до iOS 13, я столкнулся с необычной проблемой. У меня есть логика для отображения и обработки некоторых UISearchController
действий (код ниже), все части отлично работали в iOS 11 и 12.
Моей задачей было добавить кнопку поиска на панель навигации, чтобы отображалось UISearchController
после действия кнопки.
Но в iOS 13 у меня было 2 проблемы:
Код, который вызывается из действия кнопки
func showSearch() {
let searchResultsController = LUSearchResultsViewController()...
let searchController = UISearchController(searchResultsController: searchResultsController)
searchController.delegate = self
searchController.searchResultsUpdater = searchResultsController
navigationItem.searchController = searchController
definesPresentationContext = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchController.isActive = true
}
}
Только одно решение помогает мне показать контроллер поиска без каких-либо отличий от предыдущих версий iOS.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchController.isActive = true
}
Код, который работает на iOS 13, на iOS 11 и 12 код работает без asyncAfter
Код, который помогает мне скрыть UISearchController
и установить начальное состояние панели навигации в iOS 11 и 12, а не в 13. После нажатия отмены на SearchBar UISearchController
начинает вызывать методы делегирования.
//MARK: UISearchControllerDelegate
public func willDismissSearchController(_ searchController: UISearchController) {
self.navigationItem.searchController = nil
}
НО
После установки navigationItem.searchController = nil
didPresentSearchController
вызовы дважды и не только UISearchController
отклонены, но и вся UIViewController
иерархия права на UIWindow
. Или, если я добавлю здесь asyncAfter
, я получу нормальное отклонение с расширенной высотой навигационной панели, которая мне не нужна.
ТАК
- Я думаю, что asyncAfter в гвоздь, как бы вы решили эту проблему?
- Как правильно закрыть UISearchController?