Итак, после многих попыток у меня был какой-то способ заставить его работать, но я уверен, что есть гораздо более элегантные способы сделать это, поэтому если кто-то думает, что у него есть лучший способ, пожалуйста, опубликуйте его здесь и я могу использовать его и пометить ваш ответ как правильный.
Создать функцию focusOnSearchBar()
в YourViewController
:
func focusOnSearchBar() {
let searchBar = searchController.searchBar
if searchBar.canBecomeFirstResponder {
DispatchQueue.main.async {
searchBar.becomeFirstResponder()
}
} else {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.focusOnSearchBar()
}
}
}
Что он на самом деле делает, так это сам используетрекурсивно и проверять (каждые 0,1 сек), если searchBar.canBecomeFirstResponder
. Это проблематичная / не элегантная вещь.
Затем добавьте это к viewDidAppear()
:
if focusOnSearch {
searchController.isActive = true
}
Не забудьте добавить расширение в свой ViewController дляUISearchControllerDelegate
(и, конечно, установите searchController.delegate = self
) и внедрите didPresentSearchController
(который будет вызван установкой searchController.isActive = true
):
extension YourViewController: UISearchControllerDelegate {
func didPresentSearchController(_ searchController: UISearchController) {
if focusOnSearch {
focusOnSearchBar()
}
}
}
Теперь все, что вам нужно сделать, это установить focusOnSearch = true
в prepare(for segue:sender:)
.
* Примечание: , если вы хотите focusOnSearchBar , когда вы находитесь в том же viewController
из searchBar
, просто установите:
focusOnSearch = true
searchController.isActive = true
И это будет работать само собой.