【问题标题】:Search controller below navigation item prior to iOS 11iOS 11 之前的导航项下方的搜索控制器
【发布时间】:2018-03-12 21:50:43
【问题描述】:

我使用这段代码没有问题,但我想将搜索控制器放在导航项的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
}

【问题讨论】:

  • 我认为对于 iOS 10,您必须使自己的视图类似于 iOS 11 的本机功能,因为默认的做法是将搜索控制器的视图放在标题视图中。
  • 请不要发布代码图片。将实际代码作为文本发布,复制并粘贴到您的问题中。无法搜索或引用图像。

标签: swift ios10 ios11


【解决方案1】:

@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()
    }
}

通过参考另一个答案here,我在didPresentSearchController 中添加了becomeFirstResponder(),但稍有延迟。所以键盘会出现而不用敲击。最后实现UISearchControllerDelegate,这样在取消的时候就消失了:

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

【讨论】:

    【解决方案2】:

    我不知道它是否仍然与您相关,但对于任何搜索答案并最终来到这里的人来说,这是一种方法:

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

    【讨论】: