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

(注:自iOS8起,苹果便废弃UISearchDisplayController的使用,改为使用UISearchController来实现类似功能,可参考我的另一篇文章“Swift - 使用UISearchController实现带搜索栏的表格”)

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

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

效果图如下:

  

  

--- ViewController.swift ---


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

97

98

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

        // Do any additional setup after loading the view, typically from a nib.

        

        // 起始加载全部内容

        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) {

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

        // Dispose of any resources that can be recreated.

    }

}

--- Main.storyboard ---


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

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6254" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">

    <dependencies>

        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>

    </dependencies>

    <scenes>

        <!--View Controller-->

        <scene sceneID="tne-QT-ifu">

            <objects>

                <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="SwiftInAction_008_013" customModuleProvider="target" sceneMemberID="viewController">

                    <layoutGuides>

                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>

                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>

                    </layoutGuides>

                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">

                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>

                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>

                        <subviews>

                            <searchBar contentMode="redraw" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="514-A1-KsH">

                                <rect key="frame" x="0.0" y="28" width="320" height="44"/>

                                <textInputTraits key="textInputTraits"/>

                                <connections>

                                    <outlet property="delegate" destination="BYZ-38-t0r" id="HNb-H1-SIO"/>

                                </connections>

                            </searchBar>

                        </subviews>

                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>

                    </view>

                    <connections>

                        <outlet property="searchDisplay" destination="Lnz-5r-UWS" id="vbY-sQ-4L2"/>

                        <outlet property="searchDisplayController" destination="Lnz-5r-UWS" id="Kly-uU-7J1"/>

                    </connections>

                </viewController>

                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>

                <searchDisplayController id="Lnz-5r-UWS">

                    <connections>

                        <outlet property="delegate" destination="BYZ-38-t0r" id="889-9H-eic"/>

                        <outlet property="searchBar" destination="514-A1-KsH" id="jg7-8Q-dht"/>

                        <outlet property="searchContentsController" destination="BYZ-38-t0r" id="S5V-Yk-ta3"/>

                        <outlet property="searchResultsDataSource" destination="BYZ-38-t0r" id="5rb-QW-jlM"/>

                        <outlet property="searchResultsDelegate" destination="BYZ-38-t0r" id="9rR-uv-SDW"/>

                    </connections>

                </searchDisplayController>

            </objects>

        </scene>

    </scenes>

</document>

时间: 2024-11-06 19:54:53

Swift - 带结果列表的搜索条(UISearchDisplayController)的用法的相关文章

Swift - 搜索条(UISearchBar)的用法

1,搜索条Options属性还可设置如下功能样式: Shows Search Results Button:勾选后,搜索框右边显示一个圆形向下的按钮,单击会发送特殊事件. Shows Bookmarks Button:勾选后,搜索框右边会显示一个书本的按钮,单击会发送特殊事件. Shows Cancel Button:勾选后,搜索框右边会出现一个“Cancel”按钮,单击会发送特殊事件. Shows Scope Bar:勾选后,会在搜索条下面出现一个分段控制器. 2,下面是一个搜索条的使用样例,

点击搜索取消UISearchDisplayController的搜索状态

一般,我们用到UISearchDisplayController的时候,都是须要对一个数据源进行刷选,在UISearchDisplayController自带的tableView中展示出来,然后点击退出详情.我近期在做大众点评第三方的时候,遇到一个问题,我展示出了所有商店,想加搜索功能,可是不知道输入的搜索keyword去跟什么匹配,大众点评也并没有提供一个用来刷选的数据源接口,这样,我仅仅能自己输入keyword,不用它数据源提供刷选补全内容,而直接点击弹出键盘的搜索键,进行搜索.只是点击搜索

iOS 搜索条使用详解

在ios开发中搜索条的使用挺常见的,不过之前一直没用到也没细细研究,最近做外包项目的时候刚好用到,在这里记录一下使用的过程,只要理解了原理,其实还是比较简单的!上传的图片有点大,刚好可以看清楚它的使用效果! 我喜欢一步步的解析控件使用过程,其实真正的用心做一件事情是很享受的,虽然现在的社会都很注重效率和回报,这也是中国这种社会环境下难出大师级的人物的很重要的一个因素.扯得有点远了,只是希望国内开发者不要太急功近利,熟练应用本不是难事,一点点积累就好.下面开始搜索条 UISearchBar 和 U

模仿京东顶部搜索条效果制作的一个小demo

最近模仿京东顶部搜索条效果制作的一个小demo,特贴到这里,今后如果有用到可以参考一下,代码如下 1 #define kScreenWidth [UIScreen mainScreen].bounds.size.width 2 #define kScreenHeight [UIScreen mainScreen].bounds.size.height 3 4 #import "mainViewController.h" 5 6 @interface mainViewController

Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)

转载请注明地址:http://blog.csdn.net/xiaanming/article/details/10298163 很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己来自定义一个能满足我们需求的View,自定义View我们需要先继承View,添加类的构造方法,重写父类View的一些方法,例如onDraw,为了我们自定义的View在一个项目中能够重用,有时候我们需要自定义其属性,举个很简单的例子,我在项目中的多个界面使用我自定义的View,每个界面该自定义View

iOS中的2中搜索方式UISearchDisplayController和UISearchController

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 以前iOS的搜索一般都使用UISearchDisplayController来完成,不过自从iOS 8.0开始,该控制器被标记为废弃,我们可以在iOS 8.0之后使用一个新的搜索控制器UISearchController来完成搜索. 本篇博文将介绍以上2种搜索控制器的简单用法,并比较它们的区别.Let't Go! UISearchDisplayControll

Android 带进度的圆形进度条

extends:http://blog.csdn.net/xiaanming/article/details/10298163 转载请注明地址:http://blog.csdn.net/xiaanming/article/details/10298163 很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己来自定义一个能满足我们需求的View,自定义View我们需要先继承View,添加类的构造方法,重写父类View的一些方法,例如onDraw,为了我们自定义的View在一个项

使用CSS3和jQuery可伸缩的搜索条

搜索条在我们网站是必不可少的,尤其是在有限的页面空间里,放置一个重要的搜索条是个难题,今天我将结合实例给大家介绍一下如何使用CSS3和jQuery来实现一个可伸缩功能的搜索条. HTML 在需要放置搜索条的页面中放置如下html代码,搜索条#search_bar包含一个form#myform表单,表单中放置一个搜索输入框#search,一个搜索按钮.search_btn以及搜索按钮图标.search_ico. <div id="search_bar" class="se

【转】 Pro Android学习笔记(五十):ActionBar(3):搜索条

目录(?)[-] ActionBar中的搜索条 通过Menu item上定义search view 进行Searchable的配置 在activity中将search view关联searchable activity Searchable activity的代码 ActionBar中的搜索条 我们同样可以在Action Bar中嵌入搜索条.在小例子中,我们在action bar中嵌入一个搜索框的widget(称为search view).当我们输入搜索内容,能够在指定的activity中打开(