美文网首页
UISearchController

UISearchController

作者: 夜雨聲煩_ | 来源:发表于2018-11-15 14:47 被阅读0次

    定义

    //声明UISearchController
    var searchController: UISearchController!
    //声明数组存储搜索结果
    var searchResults: [AreaMO] = []
    

    初始化

    //设置tableview的自动调整
    if #available(iOS 11, *) {
        self.tableView.contentInsetAdjustmentBehavior = .always
    } else {
        self.automaticallyAdjustsScrollViewInsets = true
    }
    //设置包括bar的扩展
    self.extendedLayoutIncludesOpaqueBars = true
    //push到下一个页面后自动隐藏searchbar
    self.definesPresentationContext = true
    //和上一行代码一起共同解决了点击取消后的动画问题!!!
    self.edgesForExtendedLayout = .init(rawValue: 0)
    //初始化
    searchController = UISearchController(searchResultsController: nil)
    //开始搜索后是否隐藏背景内容(默认隐藏,即用模板盖住,无法点击内容)
    searchController.dimsBackgroundDuringPresentation = false
    //开始搜索后是否隐藏navbar (默认隐藏,隐藏可能会出现动画问题,修改此项关闭)
    searchController.hidesNavigationBarDuringPresentation = true
    //设置代理
    searchController.searchResultsUpdater = self
    //设置背景色(通过此项设置背景色,而不是backgroundColor)
    searchController.searchBar.barTintColor = UIColor.groupTableViewBackground
    //去掉上下黑线(searchbar上下自带两行黑线,使用设置边框跟背景色相同的方式去掉黑线,直接去掉边框不行)
    searchController.searchBar.layer.borderWidth = 1
    searchController.searchBar.layer.borderColor = UIColor.groupTableViewBackground.cgColor
    //将headerview设置成searchbar
    tableView.tableHeaderView = searchController.searchBar
    

    查询方法

    //参数为searchbar内容

    func searchFilter(text: String) {
        searchResults = areas.filter({ (area) -> Bool in
              //忽略大小写匹配
            return (area.name!.localizedCaseInsensitiveContains(text))
        })
    }
    

    tableview相关代码修改

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //搜索框正在编辑,即正在查询时,显示查询内容数目
        return searchController.isActive ? searchResults.count : areas.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "areaCustomCell", for: indexPath) as! AreaCustomTableViewCell
        //搜索框正在编辑,即正在查询时,显示查询内容
        let area = searchController.isActive ? searchResults[indexPath.row] : areas[indexPath.row]
        ...
        return cell
    }
    

    UISearchResultsUpdating代理方法

    遵循UISearchResultsUpdating协议

    func updateSearchResults(for searchController: UISearchController) {
        //判断是否有搜索内容
        if var text = searchController.searchBar.text {
            //过滤首末尾空格(此方法不能过滤中间)
            text = text.trimmingCharacters(in: .whitespaces)
            //调用查找方法
            searchFilter(text: text)
            //重新加载tableview
            tableView.reloadData()
        }
    }
    

    点击进入下一页面

    正在搜索时点选传入搜索结果对象到下一页面

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail" {
            let dest = segue.destination as! DetailTableViewController
            //判断是否正在搜索,如果是传入搜索结果数组中对象,否则传入源数据中对象
            dest.area = searchController.isActive ? self.searchResults[self.tableView.indexPathForSelectedRow!.row] : self.areas[self.tableView.indexPathForSelectedRow!.row]
        }
    }
    

    相关文章

      网友评论

          本文标题:UISearchController

          本文链接:https://www.haomeiwen.com/subject/bxjyfqtx.html