当前位置: 移动技术网 > IT编程>移动开发>IOS > [iOS学习]之UISearchController简单使用

[iOS学习]之UISearchController简单使用

2018年10月14日  | 移动技术网IT编程  | 我要评论

台湾时政,霸州市邮编,四个月宝宝腹泻怎么办

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网