[iOS学习]之UISearchController简单使用
程序员文章站
2022-08-17 16:52:52
[ios学习]之uisearchcontroller简单使用,在 ios 8.0 之前实现搜索功能我们用的是 uisearchbar 和uisearchdisplaycontroller,但是在 i...
[ios学习]之uisearchcontroller简单使用,在 ios 8.0 之前实现搜索功能我们用的是 uisearchbar 和uisearchdisplaycontroller,但是在 ios 8.0 之后上述方法已经被弃用,因此本篇文章用 uisearchcontroller 实现基本的搜索功能。本文的代码在我的 github 上下载!
如何使用 uisearchcontroller
初始化 uisearchcontroller 遵守 uisearchresultsupdating 协议 实现协议方法初始化 uisearchcontroller
// 如果你希望搜索结果在当前视图显示,searchresultscontroller 设为 nil,否则传入新的视图控制器 - (instancetype)initwithsearchresultscontroller:(nullable uiviewcontroller *)searchresultscontroller;
遵守 uisearchresultsupdating 协议, 实现搜索展示功能
// 当改变或调用 searchbar 时调用 – (void)updatesearchresultsforsearchcontroller:(uisearchcontroller *)searchcontroller;
demo
下面用实际案例来操作一遍。
在原本控制器展示结果
首先声明和定义属性
@interface adsourcevc () @property (nonatomic, strong) uisearchcontroller *searchcontroller; /** 要搜索的数据源 */ @property (nonatomic, strong) nsarray *datalist; /** 搜索结果数据源 */ @property (nonatomic, strong) nsmutablearray *searchlist; @end
初始化 uisearchcontroller
#pragma mark - lazy load - (uisearchcontroller *)searchcontroller { if (_searchcontroller == nil) { // searchresultscontroller为nil时,表示在当前控制器显示搜索结果 _searchcontroller = [[uisearchcontroller alloc] initwithsearchresultscontroller:nil]; // 搜索栏的占位内容 _searchcontroller.searchbar.placeholder = @"请输入搜索内容"; // 遵守协议 self.searchcontroller.searchresultsupdater = self; self.searchcontroller.delegate = self; self.searchcontroller.searchbar.delegate = self; [self.searchcontroller.searchbar sizetofit]; self.definespresentationcontext = yes; // 是否添加半透明覆盖 self.searchcontroller.obscuresbackgroundduringpresentation = no; // 在搜索过程中是否隐藏了底层内容(使用obscuresbackgroundduringpresentation代替) // self.searchcontroller.dimsbackgroundduringpresentation = no; // 在搜索时是否应该隐藏导航栏 self.searchcontroller.hidesnavigationbarduringpresentation = yes; self.tableview.tableheaderview = self.searchcontroller.searchbar; } return _searchcontroller; }
实现代理方法
#pragma mark - - (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section { return self.searchcontroller.active ? self.searchlist.count : self.datalist.count; } - (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath { static nsstring *str = @"cell"; uitableviewcell *cell = [tableview dequeuereusablecellwithidentifier:str]; if (!cell) { cell = [[uitableviewcell alloc] initwithstyle:uitableviewcellstyledefault reuseidentifier:str]; } nsarray *datas = self.searchcontroller.active ? self.searchlist : self.datalist; cell.textlabel.text = datas[indexpath.row]; return cell; } #pragma mark - // 搜索时触发的方法 - (void)updatesearchresultsforsearchcontroller:(uisearchcontroller *)searchcontroller { nsstring *searchstr = self.searchcontroller.searchbar.text; // 谓词 nspredicate *predicate = [nspredicate predicatewithformat:@"self contains %@", searchstr]; // 过滤数据 self.searchlist = [nsmutablearray arraywitharray:[self.datalist filteredarrayusingpredicate:predicate]]; // 刷新列表 [self.tableview reloaddata]; }
在新的控制器展示结果
如果我们想要在新的控制器中展示结果,在初始化 uisearchcontroller 的时候指定展示的控制器即可。然后在新控制器中设置新样式即可。
// 搜索结果控制器 adsearchresulttvc *resulttvc = [[adsearchresulttvc alloc] init]; // uisearchcontroller初始化 _searchcontroller = [[uisearchcontroller alloc] initwithsearchresultscontroller:resulttvc];