欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

[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];