2017-08-14 60 views
4

enter image description hereiOS11 SearchController在导航栏与范围按钮

在iOS中11,你可以把一个UISearchController在导航栏用几行代码。

我在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

+0

你的文件与苹果的错误报告? – matt

+0

是的,来源 – h4labs

+0

你误认了发生了什么。范围栏按钮不会消失;整个搜索控制器界面正在被解雇。如果您想在导航栏中看到带范围按钮的示例,请告知我们。但总的来说,我有一种感觉,苹果希望你在结果表视图中使用分段控件(如果你愿意,我也可以向你展示一个例子)。 – matt

回答

1

尽量在setupNavBar()添加以下代码:

searchController.dimsBackgroundDuringPresentation = false 
+0

这有点奏效。然后它导致不能再点击背景的问题来解除焦点在搜索栏上。 – BananaNeil

0

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

searchController.dimsBackgroundDuringPresentation = false 

但我后来遇到了不能再点击背景的问题来关闭搜索栏的焦点。

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

searchController.active = false 
+0

你可以发布一个你的实现的例子吗? –

0

在您的视图控制器,你需要加入这一行

self.definesPresentationContext = YES;

这告诉UISearchController它需要使用演示背景下,由您的ViewController定义。

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