我毫无问题地使用此代码,但是我想将搜索控制器放在导航项目的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
}
我不知道它是否仍然与您相关,但是对于任何搜索答案并最终到达这里的人来说,这是一种方法:
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()
}
}
通过参考另一个答案,我在didPresentSearchController
中添加了becomeFirstResponder()
,并稍有延迟。因此,键盘将出现而无需敲击。最后,实现UISearchControllerDelegate
,以便在取消时会消失:
func willDismissSearchController(_ searchController: UISearchController) {
if #available(iOS 11.0, *) {
navigationItem.searchController = nil
} else {
// Fallback on earlier versions
tableView.tableHeaderView = nil
}
}