在 iOS 11 之前的导航项下方搜索控制器

Search controller below navigation item prior to iOS 11

我使用这段代码没问题,但我想将搜索控制器放在导航项 titleView 的下方,而不是替换它。使用 iOS11 就像将 navigationItem.searchController 设置为 searchController 一样简单,它将把它放在 titleView 下面,但在 navigationItem.[=18= 中]

关于如何在 iOS 11 之前执行此操作的任何想法,而不是替换 titleView

当前代码:

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

我不知道它是否仍然与你相关,但对于任何搜索答案并在此处结束的人来说,这是一种方法:

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

@holger 的回答帮助我解决了 iOS 10 中的问题 - 它在按取消时不小心隐藏了整个导航栏。

由于我的应用程序在导航栏的标题处有一个徽标,因此搜索栏在不使用时必须隐藏。所以我添加了一个搜索按钮 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()
    }
}

参考另一个答案here,我在didPresentSearchController里面添加了becomeFirstResponder(),稍有延迟。因此键盘将在不点击的情况下出现。最后,实现 UISearchControllerDelegate 以便它在取消时消失:

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