Как отобразить UISearchController в UINavigationItem без базового UIScrollView? - PullRequest
0 голосов
/ 29 мая 2019

Может быть, это невозможно, но я всегда предполагал, что вы можете просто сгенерировать экземпляр 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
        }()
    }
}

На экране никогда не появляется строка поиска.Это похоже на обычную старую панель навигации.

1 Ответ

1 голос
/ 29 мая 2019

Инициализатор 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
...