Пока я обновлял свой проект до 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 .После нажатия cancel на панели поиска, UISearchController
начинает вызывать методы делегата.
//MARK: UISearchControllerDelegate
public func willDismissSearchController(_ searchController: UISearchController) {
self.navigationItem.searchController = nil
}
НО
После установки navigationItem.searchController = nil
didPresentSearchController
вызовы дважды и не только UISearchController
отклонено, но и целая UIViewController
иерархия вправо до UIWindow
.Или если я добавлю asyncAfter
здесь, я получу нормальное отклонение с расширенной высотой навигационной панели, которая мне не нужна.
SO
- Я думаю, чтоasync После этого, как вы решите эту проблему?
- Как правильно отменить UISearchController?