Swift 5 & iOS 13 UISearchController неправильно представляет и отклоняет поведение - PullRequest
3 голосов
/ 24 сентября 2019

Пока я обновлял свой проект до 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

  1. Я думаю, чтоasync После этого, как вы решите эту проблему?
  2. Как правильно отменить UISearchController?

1 Ответ

0 голосов
/ 26 сентября 2019

Я могу помочь вам с первой частью.

Вместо выполнения асинхронной части вы можете использовать это:

searchController.searchBar.layoutIfNeeded()        
searchController.isActive = true

SearchController не готов в данный момент, и онПрежде чем он станет активным, необходимо выполнить компоновку.

Путем компоновки панели поиска мы форсируем это, и она будет срабатывать только при наличии чего-либо для компоновки.

...