Возможно, это невозможно, но я всегда предполагал, что вы можете просто бросить экземпляр UISearchController на любой старый контроллер представления navigationItem и получить панель поиска. Мне кажется, как бы я ни пытался, я не могу заставить его работать. Это заставляет меня думать, что это поведение жестко запрограммировано, чтобы работать только тогда, когда свойство view контроллера представления является подклассом UIScrollView.
Я надеюсь, что это просто отвлекающий маневр. Если я пропустил что-то очевидное, пожалуйста, помогите! Это бесит.
Вот что я сделал:
import UIKit.UIViewController
class MainViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.hidesSearchBarWhenScrolling = false
navigationItem.searchController = {
let searchController = UISearchController()
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.obscuresBackgroundDuringPresentation = false
return searchController
}()
}
}
На экране никогда не появляется строка поиска. Это выглядит как обычная старая панель навигации.





Инициализатор UISearchController должен быть let searchController = UISearchController(searchResultsController: nil) или заменить nil отдельным контроллером для отображения результатов поиска.
Если ваш viewController находится в стеке UINavigationController, приведенный выше код должен работать (с исправленным инициализатором). В противном случае вам нужно будет создать UINavigationBar и добавить его в представление. Затем добавьте searchController.searchBar к navigationItem.titleView
let navigationBar = UINavigationBar()
view.addSubview(navigationBar)
navigationBar.barTintColor = UIColor.gray
navigationBar.translatesAutoresizingMaskIntoConstraints = false
navigationBar.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
navigationBar.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
navigationBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
navigationBar.delegate = self
navigationBar.items = [navigationItem]
navigationItem.searchController = {
let searchController = UISearchController(searchResultsController: nil)
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.obscuresBackgroundDuringPresentation = false
return searchController
}()
navigationItem.titleView = navigationItem.searchController?.searchBar
О! Это был инициализатор, который я выбрал все время.