将 UISearchController 与 UINavigationController 一起使用

Posted

技术标签:

【中文标题】将 UISearchController 与 UINavigationController 一起使用【英文标题】:Using UISearchController with UINavigationController 【发布时间】:2015-04-14 04:02:24 【问题描述】:

我遇到了与here 相同的问题,它没有任何答案。 (将 searchController.active 设置为 false 会清除我不想要的搜索文本。)我想使用 UISearchController 以便用户可以搜索我的 UITableView 中的项目列表。我在 Interface Builder 中连接了一个 show segue,它在选择表视图的单元格时触发。 问题是,如果用户搜索某些内容,然后单击表格的一个单元格,当它转到新视图时,搜索栏就坐在那里。理想情况下,我希望导航栏在用户搜索时被搜索栏“替换”,然后在用户单击单元格时返回导航栏,然后在用户单击时返回搜索栏“返回键。 (这是现在已弃用的 UISearchDisplayController 的工作方式。)我怎样才能做到这一点?这是我的表格视图的控制器。

class ItemSearchViewController: UITableViewController, UISearchResultsUpdating

    var searchController: UISearchController?

    let itemList = [ItemList(category:"Chocolate", name:"chocolate Bar", price: 1234),
    ItemList(category:"Chocolate", name:"chocolate Chip", price: 1234),
    ItemList(category:"Chocolate", name:"dark chocolate", price: 1234),
    ItemList(category:"Hard", name:"lollipop", price: 1234),
    ItemList(category:"Hard", name:"candy cane", price: 1234),
    ItemList(category:"Hard", name:"jaw breaker", price: 1234),
    ItemList(category:"Other", name:"caramel", price: 1234),
    ItemList(category:"Other", name:"sour chew", price: 1234),
    ItemList(category:"Other", name:"gummi bear", price: 1234)]

    var filteredList : [ItemList] = []

    override func viewDidLoad()
    
        super.viewDidLoad()

        self.title = "Item Search"
        self.tableView.delegate = self
        self.tableView.dataSource = self

        self.searchController = UISearchController(searchResultsController: nil)
        self.searchController!.searchResultsUpdater = self
        self.searchController!.hidesNavigationBarDuringPresentation = true
        self.searchController!.dimsBackgroundDuringPresentation = false
        self.searchController!.searchBar.searchBarStyle = .Minimal
        self.searchController!.searchBar.sizeToFit()
        self.tableView.tableHeaderView = self.searchController!.searchBar  
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    
        if (segue.identifier == "itemDetail")
        
            let itemDetailViewController = segue.destinationViewController as UIViewController
            let selectedCell = sender as UITableViewCell
            itemDetailViewController.title = selectedCell.textLabel?.text
        
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    
        let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
        var item : ItemList

        if self.searchController!.active
        
            item = self.filteredList[indexPath.row]
        
        else
        
            item = self.itemList[indexPath.row]
        

        cell.textLabel!.text = item.name
        return cell


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    
        if (self.searchController!.active)
        
            return self.filteredList.count
        
        else
        
            return self.itemList.count
        
    


extension ItemSearchViewController: UISearchResultsUpdating

    func updateSearchResultsForSearchController(searchController: UISearchController)
    
        if (searchController.searchBar.text.isEmpty)
        
            self.filteredList = self.itemList
        
        else
        
            let searchPredicate =
            
                (item: ItemList) -> Bool in
                item.name.rangeOfString(searchController.searchBar.text, options: .CaseInsensitiveSearch) != nil
            
            self.filteredList = self.itemList.filter(searchPredicate)
        
        self.tableView.reloadData()
    

【问题讨论】:

【参考方案1】:

viewDidLoad()中添加这一行

definesPresentationContext = true

来自definesPresentationContext的文档

一个布尔值,指示当视图控制器或其后代之一呈现视图控制器时是否覆盖此视图控制器的视图。

讨论

当一个视图控制器被呈现时,ios 从呈现视图控制器开始并询问它是否要提供呈现 语境。如果呈现视图控制器不提供上下文, 然后 iOS 询问呈现视图控制器的父视图 控制器。 iOS 向上搜索视图控制器层次结构 直到视图控制器提供表示上下文。如果没有视图 控制器提供上下文,即窗口的根视图 控制器提供演示上下文。

如果视图控制器返回 true,那么它提供了一个演示文稿 语境。视图控制器覆盖的窗口部分 view 确定呈现的视图控制器视图的大小。 此属性的默认值为 false。

【讨论】:

以上是关于将 UISearchController 与 UINavigationController 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

带有 UITableView ui 故障的 UISearchController

IOS UI-UISearchController

将 UISegmentedControl 与 UISearchController 一起使用

将 UISearchController 与 UINavigationController 一起使用

如何将 UISearchController 与 SwiftUI 集成

将 unwind segue 与 UISearchController 一起使用时出错