#ios #swift #ios11 #uisearchcontroller #ios12
#iOS #swift #ios11 #uisearchcontroller #ios12
Вопрос:
У меня есть приложение, которое показывает список элементов, извлеченных из API, в UITableView (давайте назовем это MasterList
). При нажатии на элемент в MasterList
:
- Я подключаю ViewController (назовите это как
DetailList
) к контроллеру навигации - Выполните сетевой вызов, чтобы получить элементы в соответствии с выбором в
MasterList
- Отображать извлеченные элементы в UITableView в DetailList
- Сетевой API сообщает приложению, показывать панель поиска или нет, с помощью свойства с именем
showSearchBar
. - Сетевому 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() } } «