代码之家  ›  专栏  ›  技术社区  ›  Alec O

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

  •  13
  • Alec O  · 技术社区  · 8 年前

    我使用这段代码没有问题,但我想把搜索控制器放在导航项下面 titleView navigationItem.searchController searchController 标题视图 ,但在 navigationItem .

    关于如何在iOS 11之前做到这一点,而不是取代 ?

    if #available(iOS 11, *) {
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
    } else {
        navigationItem.titleView = searchController.searchBar
    }
    
    2 回复  |  直到 8 年前
        1
  •  27
  •   Holger    8 年前

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

    if #available(iOS 11.0, *) {
       navigationItem.searchController = searchController
    } else {
       tableView.tableHeaderView = searchController.searchBar
    }
    
        2
  •  0
  •   John Pang    7 年前

    @霍尔格的回答帮助我解决了iOS 10中的问题——当按下取消键时,它意外地隐藏了整个导航栏。

    rightBarButtonItem ,按下时触发霍尔格代码。

    @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 ,我补充道 becomeFirstResponder() didPresentSearchController 稍有延迟。因此,键盘将在不点击的情况下显示。最后,实现 UISearchControllerDelegate 这样在取消时它就会消失:

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