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()
    }
}

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/25/swift-ui-search-bar-with-result-list-uisearchdisplaycontroller/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Swift UI – 带结果列表的搜索条(UISearchDisplayController)的用法
注:代码已升级至Swift4 注:自iOS8起,苹果便废弃UISearchDisplayController的使用,改为使用UISearchController来实现类似功能 UISearchDisplayController……
<<上一篇
下一篇>>
文章目录
关闭
目 录