Swift UI – 带结果列表的搜索条(UISearchDisplayController)的用法

注:代码已升级至Swift4
注:自iOS8起,苹果便废弃UISearchDisplayController的使用,改为使用UISearchController来实现类似功能

UISearchDisplayController控件默认封装了UISearchBar和UITableView,可同时提供搜索和结果表格显示功能。

以下提供了一个使用样例,同时通过代码定制UISearchBar的一些属性来实现自定义的外观和效果,并且展示用于选择搜索范围的分段条的用法。

import UIKit

class ViewController: UIViewController, UISearchBarDelegate {

    // 引用通过storyboard创建的控件
    @IBOutlet var searchDisplay: UISearchDisplayController!

    // 所有组件
    var ctrls:[String] = ["Label","Button1-初级","Button1-高级","Button2-初级","Button2-高级","Switch"]

    // 搜索匹配的结果,Table View使用这个数组作为datasource
    var ctrlsel:[String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // 起始加载全部内容
        self.ctrlsel = self.ctrls
        // 注册TableViewCell
        self.searchDisplay.searchResultsTableView.registerClass(UITableViewCell.self,
            forCellReuseIdentifier: "SwiftCell")
        // 设置文本提示
        self.searchDisplay.searchBar.placeholder = "输入搜索信息"
        // 可以设置初始值
        // self.searchDisplay.searchBar.text = "b"
        // 设置搜索栏提示信息(标题)
        self.searchDisplay.searchBar.prompt = "搜索组件名称"
        // 不显示Search Bar边框
        self.searchDisplay.searchBar.searchBarStyle = UISearchBarStyle.Minimal
        // 显示分段条
        self.searchDisplay.searchBar.showsScopeBar = true
        self.searchDisplay.searchBar.scopeButtonTitles = ["全部","初级","高级"]
    }

    // 返回表格行数(也就是返回控件数)
    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return self.ctrlsel.count
    }

    // 创建各单元显示内容(创建参数indexPath指定的单元)
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!)
        -> UITableViewCell!
    {
        // 为了提供表格显示性能,已创建完成的单元需重复使用
        let identify:String = "SwiftCell"
        // 同一形式的单元格重复使用,在声明时已注册
        let cell = self.searchDisplay.searchResultsTableView.dequeueReusableCellWithIdentifier(
            identify, forIndexPath: indexPath) as UITableViewCell
        cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
        cell.textLabel?.text = self.ctrlsel[indexPath.row]
        return cell
    }

    // 搜索代理UISearchBarDelegate方法,每次改变搜索内容时都会调用
    func searchBar(searchBar: UISearchBar!, textDidChange searchText: String!) {
        self.searchText = searchText
        searchCtrls()
    }

    // 选择分段条时调用
    func searchBar(searchBar: UISearchBar!, selectedScopeButtonIndexDidChange selectedScope: Int) {
        print(selectedScope)
        searchCtrls();
    }

    // 保存搜索内容
    var searchText:String = ""

    // 搜索过滤
    func searchCtrls() {
        // 没有搜索内容时显示全部组件
        if self.searchText == "" {
            self.ctrlsel = self.ctrls
        } else {
            var scope = self.searchDisplay.searchBar.selectedScopeButtonIndex;
            // 匹配用户输入内容的前缀
            self.ctrlsel = []
            for ctrl in self.ctrls {
                let lc = ctrl.lowercaseString
                if lc.hasPrefix(self.searchText) {
                    if (scope == 0 || (scope == 1 && lc.hasSuffix("初级"))
                        || (scope == 2 && lc.hasSuffix("高级"))) {
                        self.ctrlsel.append(ctrl)
                    }
                }
            }
        }

        // 不需要刷新Table View显示
        // self.searchDisplay.searchResultsTableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
上一篇 Swift UI - 搜索条(UISearchBar)的用法
下一篇 微信内置浏览器清除缓存
目录
文章列表
1 Android Gradle compile、provided、api、implementation等指令注意点
Android Gradle compile、provided、api、implementation等指令注意点
2
No modifications are allowed to a locked ParameterMap 解决方案
No modifications are allowed to a locked ParameterMap 解决方案
3
Jenkins参数化构建
Jenkins参数化构建
4
Laravel count的使用
Laravel count的使用
5
Android插件化启动Activity
Android插件化启动Activity
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。