UISearchController не отображается в iOS 12

#ios #swift #ios11 #uisearchcontroller #ios12

#iOS #swift #ios11 #uisearchcontroller #ios12

Вопрос:

У меня есть приложение, которое показывает список элементов, извлеченных из API, в UITableView (давайте назовем это MasterList ). При нажатии на элемент в MasterList :

  1. Я подключаю ViewController (назовите это как DetailList ) к контроллеру навигации
  2. Выполните сетевой вызов, чтобы получить элементы в соответствии с выбором в MasterList
  3. Отображать извлеченные элементы в UITableView в DetailList
  4. Сетевой API сообщает приложению, показывать панель поиска или нет, с помощью свойства с именем showSearchBar .
  5. Сетевому API требуется около 30 мс, чтобы вернуться с ответом. Но на данный момент, когда я пытаюсь показать UISearchController в navigationItem, он не отображается.

ПРИМЕЧАНИЕ: Это упрощенный код для удобства понимания:

     override func viewDidLoad() {
        super.viewDidLoad()

        //Make a network call to get data
        viewModel.getData()
    }

    //Callback from viewModel when data is received
    func didGetNetworkResponse() {
        configureSearchController()
        //other routines to populate UITableView, etc.
    }

    func configureSearchController() {
        //viewModel decides to show search-bar based on API response 
        //safe to assume the API returns `true`
        guard viewModel.shouldShowSearchBar else { return }

        let searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.searchBar.autocapitalizationType = .none
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.delegate = self
        searchController.searchBar.placeholder = "Search for items"

        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false

        definesPresentationContext = true
        navigationController?.view.setNeedsLayout()
        navigationController?.view.layoutIfNeeded()
    }
  

В то время как UISearchController отображается правильно, если я пытаюсь показать его в viewDidLoad(), не дожидаясь ответа API.
Также все вышеперечисленное отлично работает в iOS 13.x

Вопросы:

  • Я что-то упускаю в приведенном выше коде
  • Известна ли проблема с тем, что UISearchController не отображается в iOS 11 и 12, когда вызов для его установки задерживается (в данном случае из-за ответа сети)
  • В чем разница в поведении между iOS 13 и iOS 12

Ценю вашу помощь.

Комментарии:

1. Я даже пытался выполнить функцию в основном потоке следующим образом: « func didGetNetworkResponse() { DispatchQueue.main.async { [слабый self] в self? .configureSearchController() } } «