【iOS】—— 浅谈UISearchController

2023-05-16

UISearchControlleriOS的一个系统的搜索控件,在平时我们输入信息的时候会出现相应的联想搜索的内容,然后通过UITableView展示到搜索框的下面,供我们选择。原本还想用UITextField来实现这个功能,人家现在有,那就浅学习一手。

一、需要遵守的协议:

因为它用到的UITableView所以一定是要用到UITableViewDelegate, UITableViewDataSource的,另外我们要实现其联想搜索功能还的遵守这两个协议UISearchControllerDelegate, UISearchResultsUpdating

二、属性及方法:

1.初始化方法:

- (instancetype)initWithSearchResultsController:(nullable UIViewController *)searchResultsController;参数为nil,表示使用当前控制器作为展示结果的控制器。否则,使用指定的控制器作为显示结果的控制器。

2.两个代理:

(1) UISearchControllerDelegate该代理中的方法用来告知用户结果视图的状态(即将出现,已经出现,即将消失,已经消失)。

//当自动呈现或删除发生时,调用这些方法。如果自己呈现或取消搜索控制器,它们将不会被调用。
- (void)willPresentSearchController:(UISearchController *)searchController;
- (void)didPresentSearchController:(UISearchController *)searchController;
- (void)willDismissSearchController:(UISearchController *)searchController;
- (void)didDismissSearchController:(UISearchController *)searchController;

// 在搜索控制器的搜索栏同意开始编辑或“active”被设置为YES时调用。如果您选择不呈现控制器或不实现此方法,则将代表您执行默认表示。
- (void)presentSearchController:(UISearchController *)searchController;

(2) UISearchResultsUpdating该代理中- (void)updateSearchResultsForSearchController:(UISearchController *)searchController方法每输入一个字符就会执行该方法一次,在此方法中进行数据的更新及表视图的刷新。

3.属性:

// active 属性就是当前 searchController 是不是处于激活状态.只要点击 searchBar,active 就会被置为 true.
@property (nonatomic, assign, getter = isActive) BOOL active;

// 搜索框,根据需求可进行自定义
@property (nonatomic, strong, readonly) UISearchBar *searchBar;

// 只读属性,展示结果的视图控制器
@property (nullable, nonatomic, strong, readonly) UIViewController *searchResultsController;

// 搜索时,背景是否变暗色 ,默认为YES
@property (nonatomic, assign) BOOL dimsBackgroundDuringPresentation
  
// 搜索时,背景是否变模糊 默认为YES
@property (nonatomic, assign) BOOL obscuresBackgroundDuringPresentation NS_AVAILABLE_IOS(9_1);

// 是否隐藏导航栏,默认为YES
@property (nonatomic, assign) BOOL hidesNavigationBarDuringPresentation; 

4.个性化设置:

// 通过此种方式可以获取到searchBar内部的输入框,根据需要可对其进行个性化设置
UITextField *searchTextField = [self.systemSearchController.searchBar valueForKey:@"_searchField"];

三、实例演示:

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource, UISearchControllerDelegate, UISearchResultsUpdating>

@property (nonatomic, strong) UISearchController *mySearchController;  //搜索框
@property (nonatomic, strong) UITableView *myTableView;  //展示的tableview
@property (nonatomic, strong) NSMutableArray *mySearchResultArray;  //搜索到的数据
@property (nonatomic, strong) NSMutableArray *myDataArray;  //总数据

@end

ViewController.m

#import "ViewController.h"

#define myWidth [UIScreen mainScreen].bounds.size.width
#define myHeight [UIScreen mainScreen].bounds.size.height

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    //初始化数据源
    self.myDataArray = [[NSMutableArray alloc] initWithObjects:@"11", @"22", @"33", @"214324", @"464564", nil];
    self.mySearchResultArray = [[NSMutableArray alloc] init];
    
    self.myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, myWidth, myHeight) style:UITableViewStylePlain];
    self.myTableView.delegate = self;
    self.myTableView.dataSource = self;
    [self.view addSubview:self.myTableView];
    
    self.mySearchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.mySearchController.delegate = self;
    // 设置搜索代理
    self.mySearchController.searchResultsUpdater = self;
    // 设置搜索条大小
    [self.mySearchController.searchBar sizeToFit];
    // 设置搜索期间背景视图是否取消操作,default is YES
    self.mySearchController.obscuresBackgroundDuringPresentation = NO;
    // 设置搜索期间是否隐藏导航条,default is YES
    self.mySearchController.hidesNavigationBarDuringPresentation = NO;
    // 将 searchBar 添加到表格的开头
    self.myTableView.tableHeaderView = self.mySearchController.searchBar;
}

/*
只要搜索框的文字发生了改变,这个方法就会触发。searchController.searchBar.text 为搜索框内输入的内容
*/
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {

    // 清除上一次的搜索结果
    [self.mySearchResultArray removeAllObjects];

    // 将搜索的结果存放到数组中
    for (NSString *str in self.myDataArray) {
        //查找搜索内容在该字符串的位置
        NSRange range = [str rangeOfString:searchController.searchBar.text];
        if (range.length) {
            [self.mySearchResultArray addObject:str];
        }
    }

    // 重新加载表格视图,不加载的话将不会显示搜索结果
    [self.myTableView reloadData];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc] init];
    cell.textLabel.text = self.mySearchResultArray[indexPath.row];
    return cell;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.mySearchResultArray.count;
}


@end

2412142
4234234

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【iOS】—— 浅谈UISearchController 的相关文章

随机推荐

  • 蓝桥杯:Python组再也不怕组合数计数

    有一类题目是是这样的 xff1a 要求我们从n个数中选m个 xff0c 问共有多少种取法 如果是用C 43 43 写的话 xff0c 要应用到Lucas定理 xff0c 暴力阶乘会超时 这里给大家介绍一个Python3 8 math库自带的
  • 模拟角频率和数字角频率的关系

    概念 xff1a 模拟频率f xff1a 每秒经历多少个周期 xff0c 单位Hz xff0c 即1 s xff1b 模拟角频率 xff1a 每秒经历多少弧度 xff0c 单位rad s xff1b 数字角频率w xff08 归一化角频率
  • 对于时不变系统的理解

    来源 xff1a 信号与系统 对 时不变性 判定的一点注记 知乎
  • 「STM32入门」TIM输出比较

    输出比较的简介 输出比较英文写作OC Output Compare 输出比较可以通过比较CNT和CCR寄存器值的关系 xff0c 来对输出电平进行置高或者置低或者翻转的操作 xff0c 用于输出一定频率和占空比的PWM波形常见应用例子如 x
  • 「数字信号处理」MATLAB设计 双音多频拨号系统

    前言 实验目的 xff1a 用Matlab模拟实现双音多频拨号系统 输入 xff1a 一串数字模拟电话号码 输出 xff1a 检测出的电话号码 Matlab版本 xff1a 2021b 系统 xff1a MacOS 实验方法 xff1a 查
  • 「STM32入门」TIM定时中断

    定时器的简介 定时器可以对输入的时钟进行计数 xff0c 并在计数值达到设定值时触发中断 xff0c 在中断内可以执行中断事件不仅具备基本的定时中断功能 xff0c 而且还包含内外时钟源选择 xff0c 主从触发模式 xff0c 输入捕获
  • 二极管反向恢复过程详细解析

    二极管反向恢复过程 xff0c 现代脉冲电路中大量使用晶体管或二极管作为开关 或者使用主要是由它们构成的逻辑集成电路 而作为开关应用的二极管主要是利用了它的通 电阻很小 断 电阻很大 特性 即二极管对正向及反向电流表现出的开关作用 二极管和
  • 性能优化总结

    性能优化关注点 从图中可以看出 xff0c 性能优化的主要关注 xff1a CPU 内存 磁盘IO 网络IO等四个方面 性能指标 每个关注点都有对应的指标 xff0c 吞吐率 响应时间 QPS IOPS TP99 资源使用率是我们经常关注的
  • Python:优先队列的使用及类的自定义比较函数

    Priority queue模块 该模块定义的优先级队列 xff0c 其内部使用了 heapq 模块 xff0c 所以它的时间复杂度和heapq是相同的 当一个对象的所有元素都是可比较的时 xff0c 默认情况下是根据队列中的对象的第一个元
  • 「STM32入门」USART串口通信

    通信 通信的目的 xff1a 将一个设备的数据传送到另一个设备 xff0c 扩展硬件系统 通信协议 xff1a 制定通信的规则 xff0c 通信双方按照协议规则进行数据收发 STM32常见的通信协议 本文将介绍USART 概念解释 TX R
  • 「数字信号处理」采样过程与内插恢复完整图解

    内插与采样的关系 来源 xff1a 数字信号处理 采样与内插 DSP期末知识点题型4 哔哩哔哩 bilibili
  • 配置vscode作为STM32代码的编辑器(替代keil5)。实现:代码自动补全, 编译,下载。nRF52也可以编译。

    STM32CubeMX新建好工程在工程根目录新建文件夹 vscode在 vscode 文件夹内新建文件c cpp properties json 34 configurations 34 34 name 34 34 STM32 34 任意的
  • Python中的字典

    1 字典概念 Python内置的数据结构之一 xff0c 与列表一样是一个可变序列 以键值对的方式存储数据 xff0c 字典是一个无序的序列 xff08 列表是有序的 xff09 字典通过计算key的hash值确定存储位置 xff0c 所以
  • docker中使用cuda

    需要注意的事项 1 注意应用NVIDIA在docker hub上提供的镜像 本次使用的是 nvidia cuda 10 1 cudnn7 devel ubuntu18 04 2 在宿主机安装 nvidia docker2 3 运行时 要加
  • Mysql8.0 忘记密码怎么办

    Mysql8 0 忘记密码怎么办 今天晨雨帮身边小伙伴解决了mysql8 0无法连接上的问题 中间碰到的一些问题和大家分享一下 跳过密码登录时不成功修改密码时不成功navicat连接时报 2000的问题 1 首先先停止mysql服务 可通过
  • Kurento实战之二:快速部署和体验,Java笔试题编程题

    GitCommit 269548fa27e0089a8b8278fc4fc781d7f65a939b runc Version 1 0 0 rc92 GitCommit ff819c7e9184c13b7c2607fe6c30ae19403
  • QT使用render时pixmap背景不为透明的解决办法

    当我们需要将一个界面绘制成图片时 xff0c 就需要使用到render方法 QPixmap pixmap pwidget gt size pwidget gt render amp pixmap 如果pwidget背景为透明时 xff0c
  • 【iOS】—— 高德地图SDK基础使用

    最近稍微学了学iOS调用高德的SDK xff0c 就随便做做笔记 注意 xff1a 本篇博客基于高德地图SDK的3D地图来写的 xff0c 若使用的是2D地图可能有的方法可能有所不同 xff0c 比如自定义定位蓝点之类的 一 准备工作 xf
  • 如何做代码Code Review

    预防胜于治疗 xff0c 研究表明高效的 Code Review 可以发现70 90 的 bug xff0c Review 作用如下 xff1a 提高团队代码标准 xff0c 所有人共享同一套标准 xff0c 阻止破窗效应 推动团队合作 r
  • 【iOS】—— 浅谈UISearchController

    UISearchController是iOS的一个系统的搜索控件 xff0c 在平时我们输入信息的时候会出现相应的联想搜索的内容 xff0c 然后通过UITableView展示到搜索框的下面 xff0c 供我们选择 原本还想用UITextF