带有范围按钮的NavigationBar中的iOS11 SearchController

时间:2017-08-14 22:05:07

标签: ios swift ios11

enter image description here

在iOS 11中,您可以使用几行代码将UISearchController放在NavigationBar中。

我在ViewController.swift中设置了所有内容。

func setupNavBar() {
    navigationController?.navigationBar.prefersLargeTitles = true

    let searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = wordViewController
    searchController.searchBar.scopeButtonTitles = ["French", "English"]
    searchController.searchBar.delegate = wordViewController

    navigationItem.searchController = searchController
    // Make searchbar persistent
    navigationItem.hidesSearchBarWhenScrolling = false
}

在我的委托中,搜索会正常触发和过滤。但是,如果我单击任一范围按钮,它们就会消失。永远不会调用此委托方法。 (按范围过滤实际上尚未实现)

extension WordViewController: UISearchBarDelegate {

 func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {

    if let searchText = searchBar.text {
        print("Scoped changed: \(searchText)")
        filteredWordList = wordList.filter({$0.contains(searchText)})
    }
  }
}

完整资源来自Github:

https://github.com/melling/ios_topics/tree/master/NavBarSearch https://github.com/melling/ios_topics/tree/master/NavBarSearch/NavBarSearch

3 个答案:

答案 0 :(得分:1)

尝试在setupNavBar()中添加此代码:

searchController.dimsBackgroundDuringPresentation = false

答案 1 :(得分:0)

我能够使用Artem的解决方案,

searchController.dimsBackgroundDuringPresentation = false

但是我遇到了无法再点击背景以解除搜索栏焦点的问题。

为了解决这个问题,我创建了自己的调光器uiview(屏幕尺寸,黑色的背景颜色,不透明度为25%),并将其添加到当前显示的屏幕的视图中,并听取了点击。当用户点击它时,我将其淡出并设置

searchController.active = false

答案 2 :(得分:0)

在ViewController中,您需要添加此行

self.definesPresentationContext = YES;

这告诉UISearchController它需要使用的表示上下文,它由ViewController定义。

点击此链接了解详情:http://asciiwwdc.com/2014/sessions/228