Ios 将UISearchController与UINavigationController一起使用

Ios 将UISearchController与UINavigationController一起使用,ios,uitableview,uinavigationcontroller,segue,uisearchcontroller,Ios,Uitableview,Uinavigationcontroller,Segue,Uisearchcontroller,我的问题和,没有任何答案。(将searchController.active设置为false将清除我不需要的搜索文本。)我想使用UISearchController,以便用户可以在我的UITableView中搜索项目列表。我在界面生成器中连接了一个show segue,当选择表视图的单元格时会触发它。 问题是,如果用户搜索某个内容,然后单击表中的某个单元格,当它转到新视图时,搜索栏就在那里。理想情况下,我希望在用户搜索时用搜索栏“替换”导航栏,然后在用户单击单元格时返回导航栏,然后在用户单击“返

我的问题和,没有任何答案。(将
searchController.active
设置为
false
将清除我不需要的搜索文本。)我想使用UISearchController,以便用户可以在我的UITableView中搜索项目列表。我在界面生成器中连接了一个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()
    }
}

viewDidLoad()中添加此行

从文档中获取

一个布尔值,指示当视图控制器或其子体之一显示视图控制器时,是否覆盖此视图控制器的视图

讨论

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

如果视图控制器返回true,则它将提供一个表示 上下文视图控制器所覆盖的窗口部分 视图确定显示的视图控制器视图的大小。 此属性的默认值为false

definesPresentationContext = true