Swift - 使用UISearchController实现带搜索栏的表格

一、实时搜索

--- ViewController.swift ---

import UIKit

class ViewController: UIViewController {

    //展示列表
    var tableView: UITableView!

    //搜索控制器
    var countrySearchController = UISearchController()

    //原始数据集
    let schoolArray = ["清华大学","北京大学","中国人民大学","北京交通大学","北京工业大学",
                       "北京航空航天大学","北京理工大学","北京科技大学","中国政法大学",
                       "中央财经大学","华北电力大学","北京体育大学","上海外国语大学","复旦大学",
                       "华东师范大学","上海大学","河北工业大学"]

    //搜索过滤后的结果集
    var searchArray:[String] = [String](){
        didSet  {self.tableView.reloadData()}
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        //创建表视图
        let tableViewFrame = CGRect(x: 0, y: 20, width: self.view.frame.width,
                                    height: self.view.frame.height-20)
        self.tableView = UITableView(frame: tableViewFrame, style:.plain)
        self.tableView!.delegate = self
        self.tableView!.dataSource = self
        //创建一个重用的单元格
        self.tableView!.register(UITableViewCell.self,
                                      forCellReuseIdentifier: "MyCell")
        self.view.addSubview(self.tableView!)

        //配置搜索控制器
        self.countrySearchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self   //两个样例使用不同的代理
            controller.hidesNavigationBarDuringPresentation = false
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.searchBarStyle = .minimal
            controller.searchBar.sizeToFit()
            self.tableView.tableHeaderView = controller.searchBar

            return controller
        })()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        self.tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}import Foundation

import UIKit




extension ViewControllerUITableViewDataSource{


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


        if self.countrySearchController.isActive {


            return self.searchArray.count


        else {


            return self.schoolArray.count


        }


    }


    


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)


        -> UITableViewCell {


        //为了提供表格显示性能,已创建完成的单元需重复使用


        let identify:String "MyCell"


        //同一形式的单元格重复使用,在声明时已注册


        let cell = tableView.dequeueReusableCell(withIdentifier: identify,


                                                 for: indexPath)


        


        if self.countrySearchController.isActive {


            cell.textLabel?.text = self.searchArray[indexPath.row]


            return cell


        else {


            cell.textLabel?.text = self.schoolArray[indexPath.row]


            return cell


        }


    }


}




extension ViewControllerUITableViewDelegate{


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


        tableView.deselectRow(at: indexPath, animated: true)


    }


}




extension ViewControllerUISearchResultsUpdating{


    //实时进行搜索


    func updateSearchResults(for searchController: UISearchController) {


        self.searchArray = self.schoolArray.filter { (school) -> Bool in


            return school.contains(searchController.searchBar.text!)


        }


    }


}

 

二、点击搜索按钮后才进行搜索

--- ViewController.swift ---

import UIKit

class ViewController: UIViewController {

    //展示列表
    var tableView: UITableView!

    //搜索控制器
    var countrySearchController = UISearchController()

    //原始数据集
    let schoolArray = ["清华大学","北京大学","中国人民大学","北京交通大学","北京工业大学",
                       "北京航空航天大学","北京理工大学","北京科技大学","中国政法大学",
                       "中央财经大学","华北电力大学","北京体育大学","上海外国语大学","复旦大学",
                       "华东师范大学","上海大学","河北工业大学"]

    //搜索过滤后的结果集
    var searchArray:[String] = [String](){
        didSet  {self.tableView.reloadData()}
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        //创建表视图
        let tableViewFrame = CGRect(x: 0, y: 20, width: self.view.frame.width,
                                    height: self.view.frame.height-20)
        self.tableView = UITableView(frame: tableViewFrame, style:.plain)
        self.tableView!.delegate = self
        self.tableView!.dataSource = self
        //创建一个重用的单元格
        self.tableView!.register(UITableViewCell.self,
                                 forCellReuseIdentifier: "MyCell")
        self.view.addSubview(self.tableView!)

        //配置搜索控制器
        self.countrySearchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchBar.delegate = self  //两个样例使用不同的代理
            controller.hidesNavigationBarDuringPresentation = false
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.searchBarStyle = .minimal
            controller.searchBar.sizeToFit()
            self.tableView.tableHeaderView = controller.searchBar

            return controller
        })()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        self.tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

extension ViewControllerUITableViewDataSource

{


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


        if self.countrySearchController.isActive {


            return self.searchArray.count


        else {


            return self.schoolArray.count


        }


    }


    


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)


        -> UITableViewCell {


            //为了提供表格显示性能,已创建完成的单元需重复使用


            let identify:String "MyCell"


            //同一形式的单元格重复使用,在声明时已注册


            let cell = tableView.dequeueReusableCell(withIdentifier: identify,


                                                     for: indexPath)


            


            if self.countrySearchController.isActive {


                cell.textLabel?.text = self.searchArray[indexPath.row]


                return cell


            else {


                cell.textLabel?.text = self.schoolArray[indexPath.row]


                return cell


            }


    }


}




extension ViewControllerUITableViewDelegate


{


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


        tableView.deselectRow(at: indexPath, animated: true)


    }


}




extension ViewControllerUISearchBarDelegate {


    //点击搜索按钮


    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {


        self.searchArray = self.schoolArray.filter { (school) -> Bool in


            return school.contains(searchBar.text!)


        }


    }


    


    //点击取消按钮


    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {


        self.searchArray = self.schoolArray


    }


}

 
时间: 2024-08-04 14:28:33

Swift - 使用UISearchController实现带搜索栏的表格的相关文章

带斑马线的表格

<h1>斑马线表格</h1> <table class="table table-striped"> <thead> <tr> <th>表格标题</th> <th>表格标题</th> <th>表格标题</th> </tr> </thead> <tbody> <tr> <td>表格单元格</t

IOS 带搜索栏表视图

带搜索栏表视图 此实例主要实现 Search Bar and Search Display Controller ,注意不是Search Bar控件. Search Bar and Search Display Controller的好处在于它可以把UISearchDisplayController也添加到搜索栏,并且将委托和数据源连线完毕. 一.结构图,如下: 二.样式说明图,如下: 三.效果图,如下: 源码为: 3.1 SearchbarSimpleTable 版权声明:本文为博主原创文章,

使用OC和swift创建系统自带的刷新界面

使用OC和swift创建系统自带的刷新界面 一:swift刷新界面代码: import UIKit class ViewController: UITableViewController { // 用于显示的数据源    var _dataSource:[String] = []        // 加载更多 状态 风火轮    var _aiv:UIActivityIndicatorView!        override func viewDidLoad() {        super.

iOS开发——OC和swift创建系统自带的刷新界面

使用OC和swift创建系统自带的刷新界面 一:swift刷新界面代码: import UIKit class ViewController: UITableViewController { // 用于显示的数据源    var _dataSource:[String] = []        // 加载更多 状态 风火轮    var _aiv:UIActivityIndicatorView!        override func viewDidLoad() {        super.

bootstrap-基本导航条-带搜索栏

1.运行效果如图所示 2.实现代码如下 <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <title>基本导航条-带搜索栏</title>     <!-- 最新版本的 

Swift 脚本(运行时带参数)

#!/usr/bin/env xcrun swift import Foundation let args = Process.arguments print("Arg:\(args)") chmod +x x.sh 添加执行权限

在jsp页面中显示表格(带斜线的表格)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

Cocos2dx3.2编写常用UI组件(五)带滚动的表格GridView

前言: 按照惯例先发上效果图: 正文: 先来吐槽几句,一说起滚动效果大家可能会联想到Cocos2dx给我们提供的ScrollView.我一开始也是打算用ScrollView来实现的,但是用着用着发现出现了各种莫名其妙的错误,所以只好自己重新写一个Node,通过onTouchBegan和onTouhMoved两个事件回调来实现滚动的效果. GridView使用说明: 1.利用GridView::create(int row,int column)来创建一个GridView,row和column分别

IOS 控件 - Swift 集成 IOS 自带 API 扫描二维码

第一步:加入框架 AVFoundation.framework 目录选择 targets -> Build Phases -> Link Binary with Libraries 后,加入AVFoundation.framework即可 第二步:加入以下代码,并加入协议 AVCaptureMetadataOutputObjectsDelegate, 定义全局变量 var session: AVCaptureSession?; var previewLayer: AVCaptureVideoP