Контроллер поиска под элементом навигации до iOS 11

Я использую этот код без проблем, но я хотел бы разместить контроллер поиска под titleView элемента навигации, а не заменять его. С iOS11 это так же просто, как установить navigationItem.searchController на searchController, и он поместит его ниже titleView, но в navigationItem.

Есть идеи, как это сделать до iOS 11 вместо замены titleView?

Текущий код:

if #available(iOS 11, *) {
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
} else {
    navigationItem.titleView = searchController.searchBar
}

person Alec O    schedule 01.10.2017    source источник
comment
Я думаю, что для iOS 10 вам придется сделать свое собственное представление похожим на нативную функциональность iOS 11, поскольку по умолчанию это было сделано для того, чтобы поместить представление контроллера поиска в представление заголовка.   -  person Umar Farooque    schedule 01.10.2017
comment
Пожалуйста, не размещайте изображения кода. Опубликуйте фактический код в виде текста, скопированного и вставленного в ваш вопрос. Изображения не могут быть найдены или на них можно ссылаться.   -  person rmaddy    schedule 01.10.2017


Ответы (2)


Я не знаю, актуально ли это для вас, но для тех, кто ищет ответ и попадает сюда, это способ сделать это:

if #available(iOS 11.0, *) {
   navigationItem.searchController = searchController
} else {
   tableView.tableHeaderView = searchController.searchBar
}
person Holger    schedule 20.01.2018

Ответ @holger помогает мне решить мою проблему в iOS 10, которая случайно скрывает всю панель навигации при нажатии CANCEL.

Поскольку у моего приложения есть логотип, расположенный в заголовке панели навигации, панель поиска должна быть скрыта, когда она не используется. Поэтому я добавил кнопку поиска как rightBarButtonItem и запускал код @holger при нажатии.

@IBAction func onSearchAction(_ sender: UIBarButtonItem) {
    if #available(iOS 11.0, *) {
        navigationItem.searchController = searchController
    } else {
        // Fallback on earlier versions
        searchController.hidesNavigationBarDuringPresentation = false
        tableView.tableHeaderView = searchController.searchBar
    }
    searchController.isActive = true
}

func didPresentSearchController(_ searchController: UISearchController) {
    asyncAfter(.milliseconds(300)) {
        searchController.searchBar.becomeFirstResponder()
    }
}

Ссылаясь на другой ответ здесь, я добавил becomeFirstResponder() внутрь didPresentSearchController с небольшой задержкой. Таким образом, клавиатура появится без нажатия. Наконец, реализует UISearchControllerDelegate, чтобы он исчезал при отмене:

func willDismissSearchController(_ searchController: UISearchController) {
    if #available(iOS 11.0, *) {
        navigationItem.searchController = nil
    } else {
        // Fallback on earlier versions
        tableView.tableHeaderView = nil
    }
}
person John Pang    schedule 22.09.2018