UISearchController用swift出现在nextView中

时间:2015-10-26 06:48:05

标签: ios swift uinavigationbar uisearchcontroller

我已经以编程方式将UISearchController简化为UITableViewController。以下是我的完整代码:

import UIKit

class TableViewController: UITableViewController, UISearchResultsUpdating {

    let appleProducts = ["Mac","iPhone","Apple Watch","iPad"]
    var filteredAppleProducts = [String]()
    var resultSearchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.resultSearchController = UISearchController(searchResultsController: nil)
        self.resultSearchController.searchResultsUpdater = self
        self.resultSearchController.dimsBackgroundDuringPresentation = false
        self.resultSearchController.searchBar.sizeToFit()

        self.tableView.tableHeaderView = self.resultSearchController.searchBar

        self.tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        if (self.resultSearchController.active){
            return self.filteredAppleProducts.count
        }else{
            return self.appleProducts.count
        }
    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell?

        if (self.resultSearchController.active)
        {
            cell!.textLabel?.text = self.filteredAppleProducts[indexPath.row]

            return cell!
        }
        else
        {
            cell!.textLabel?.text = self.appleProducts[indexPath.row]

            return cell!
        }
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        let vc = self.storyboard!.instantiateViewControllerWithIdentifier("Detail") as! DetailViewController
        self.navigationController!.pushViewController(vc, animated: true)
    }
    func updateSearchResultsForSearchController(searchController: UISearchController){

        self.filteredAppleProducts.removeAll(keepCapacity: false)

        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
        let array = (self.appleProducts as NSArray).filteredArrayUsingPredicate(searchPredicate)
        self.filteredAppleProducts = array as! [String]

        self.tableView.reloadData()
    }

}

我的resultSearchController工作正常,但当我点击任何单元格时,UISearchController也会出现在我的下一个视图中,如下图所示:

enter image description here

但我的第二种观点是空的。

当我切换到另一个视图时,如何删除此resultSearchController,以便它不会显示在下一个视图中?

项目Sample了解更多信息。

1 个答案:

答案 0 :(得分:2)

只需在viewDidLoad

中添加一行
 self.definesPresentationContext = true

文档

  

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

GIF