Swift_UISearchController详解

到了iOS8,苹果废除UISearchDisplayController,建议我们使用UISearchController配合UITableView来实现。我们可以把搜索
条放在表格头部,或者放在页面顶部,还是很灵活的。下面通过代码演示如何使用UISearchController实现具有搜索功能的表格。

NS_CLASS_DEPRECATED_IOS(3_0, 8_0, “UISearchDisplayController has been replaced with UISearchController”)

效果图_使用UISearchController实现带搜索栏的表格

IMG_4173.PNG

IMG_4176.PNG

效果图_在表格头部添加一个带范围选择(scope bar)的搜索栏

IMG_4174.PNG
IMG_4175.PNG
1. initWithSearchResultsController
1. 在初始化UISearchController,它要求我们要先设计好的searchResultsController这个控制器,它可以是UITableViewController,也可以是UICollectionViewController,也可以是nil。
2. 如果设为nil的话,那数据源和搜索结果共用一个Controller。
2. dimsBackgroundDuringPresentation 设置开始搜索时背景是否显示
3. hidesNavigationBarDuringPresentation 设置开始搜索时导航条是否隐藏
4. searchResultsUpdater
这个方法很重要,当searchBar的字符内容改变时系统回调,我们一般在这里查找符合条件的搜索结果。

代码

    //搜索控制器
    var countrySearchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()
        //配置搜索控制器
        self.countrySearchController = {
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            // 设置开始搜索时导航条是否隐藏
            controller.hidesNavigationBarDuringPresentation = true
            // 设置开始搜索时背景是否显示
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.searchBarStyle = .Minimal
            controller.searchBar.placeholder = "请输入学校名称"
            controller.searchBar.sizeToFit()
            self.tableView.tableHeaderView = controller.searchBar
            return controller
        }() 
    }

    extension ViewController: UISearchResultsUpdating {
      func updateSearchResultsForSearchController(searchController: UISearchController) {
    }
}
5. NSPredicate
搜索过程中一般使用NSPredicate。
谓词中SELF代表被查询的集合。这句谓词的意思是查找集合中包含搜素字符串的数据。

extension ViewController: UISearchResultsUpdating {
    func updateSearchResultsForSearchController(searchController: UISearchController) {
        self.searchArray.removeAll(keepCapacity: false)
        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
        let arry = (self.schoolArray as NSArray).filteredArrayUsingPredicate(searchPredicate)
        self.searchArray = arry as! [String]
    }
}

UISearchControllerDemo 我放到网盘上了。https://pan.baidu.com/s/1pLap5Ir
我写了两篇Demo,使用UISearchController实现带搜索栏的表格在表格头部添加一个带范围选择(scope bar)的搜索栏
原文出自:www.hangge.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容