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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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()
}
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :