ios开发uisearchcontroller是单例的吗不是单例

iOS开发-搜索栏UISearchBar和UISearchController - 推酷
iOS开发-搜索栏UISearchBar和UISearchController
搜索栏的重要性我们就不说了,狼厂就是靠搜索起家的,现在越来越像一匹没有节操的狼,UC浏览器搜索栏现在默认自家的神马搜索,现在不管是社交,O2O还是在线教育等都会有一个搜索栏的实现,不过彼此实现效果是不一样的。iOS中的搜索栏实现起来相对简单一点,网上也有很多参考资料,不过靠谱的不是很多,很多都是iOS 8.0之前的实现,iOS 8.0上的实现貌似很少看到,看了一些老外的代码,使用了一下UISearchController感觉还是非常不错的。
UISearchBar和UIDisplayController
是网上最常见的也算是最简单的,也有使用Searh Bar Search Display Controller的控件的,本文就简单的使用Search Bar和UITableView实现搜索Demo的,最上面的就是搜索栏,之前的就是TableView:
为了实现搜索需要声明委托
UISearchBarDelegate
, UISearchDisplayDelegate,其中搜索主要使用的就是UISearchDisplayDelegate,具体代码实现过程:
@property (strong,nonatomic) NSMutableArray
@property (strong,nonatomic) NSMutableArray
初始化数据:
self.dataList=[NSMutableArray arrayWithCapacity:100];
for (NSInteger i=0; i&100; i++) {
[self.dataList addObject:[NSString stringWithFormat:@&%ld-FlyElephant&,(long)i]];
//设置区域
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
设置区域的行数(重点),这个就是使用委托之后需要需要判断是一下是否是需要使用Search之后的视图:
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (tableView == self.searchDisplayController.searchResultsTableView) {
return [self.searchList count];
return [self.dataList count];
同样的返回单元格也有两种情况,一种是初始化数据,一种是过滤之后的数据视图:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *flag=@&cellFlag&;
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:flag];
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:flag];
if (tableView==self.searchDisplayController.searchResultsTableView) {
[cell.textLabel setText:self.searchList[indexPath.row]];
[cell.textLabel setText:self.dataList[indexPath.row]];
UISearchBarDelegate中德 开始和结束的事件:
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{
NSLog(@&搜索Begin&);
return YES;
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar{
NSLog(@&搜索End&);
return YES;
搜索时过滤数据:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
// 谓词的包含语法,之前文章介绍过/xiaofeixiang/
NSPredicate *preicate = [NSPredicate predicateWithFormat:@&SELF CONTAINS[c] %@&, searchString];
if (self.searchList!= nil) {
[self.searchList removeAllObjects];
//过滤数据
self.searchList= [NSMutableArray arrayWithArray:[_dataList filteredArrayUsingPredicate:preicate]];
//刷新表格
return YES;
最终效果如下:
UISearchController实现搜索
UISeachBar通过UISearchDisplayDelegate实现上面的效果是没有问题的,网上也有很多类似的实现效果,不过是警告的,信息如下: 'searchDisplayController' is deprecated: first deprecated in iOS 8.0,这么明显一个警告总不能视而不见吧 ,
StackOverFlow
UISearchDisplayController is deprecated
, and recommended to use UISearchController instead
,也就是说
UISearchDisplayController,
也就是不推荐使用
UISearchDisplayDelegate
,但是可以通过
UISearchController
UISearchResultsUpdating 这个委托实现上面的效果;
视图中中需要声明UISearchResultsUpdating:
@interface ViewController : UITableViewController&UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate,UISearchResultsUpdating&
@property (nonatomic, strong) UISearchController *searchC
需要自己初始化一下UISearchController:
_searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
_searchController.searchResultsUpdater =
_searchController.dimsBackgroundDuringPresentation = NO;
_searchController.hidesNavigationBarDuringPresentation = NO;
_searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0);
self.tableView.tableHeaderView = self.searchController.searchB
之前是通过判断搜索时候的TableView,不过现在直接使用self.searchController.active进行判断即可,也就是UISearchController的active属性:
//设置区域的行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (self.searchController.active) {
return [self.searchList count];
return [self.dataList count];
//返回单元格内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *flag=@&cellFlag&;
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:flag];
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:flag];
if (self.searchController.active) {
[cell.textLabel setText:self.searchList[indexPath.row]];
[cell.textLabel setText:self.dataList[indexPath.row]];
具体调用的时候使用的方法也发生了改变,这个时候使用updateSearchResultsForSearchController进行结果过滤:
-(void)updateSearchResultsForSearchController:(UISearchController *)searchController {
NSString *searchString = [self.searchController.searchBar text];
NSPredicate *preicate = [NSPredicate predicateWithFormat:@&SELF CONTAINS[c] %@&, searchString];
if (self.searchList!= nil) {
[self.searchList removeAllObjects];
//过滤数据
self.searchList= [NSMutableArray arrayWithArray:[_dataList filteredArrayUsingPredicate:preicate]];
//刷新表格
[self.tableView reloadData];
不过两者最终实现的效果的效果基本上是一致,殊途同归,本文难免有所遗漏,如有不当,请多多指正~
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致iOS UISearchController的使用 - iPhone手机开发技术文章 - 红黑联盟
iOS UISearchController的使用
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self setTabBarHidden:YES withAnimation:YES];
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.mySearchController.searchBar setHidden:YES];
[self setTabBarHidden:NO withAnimation:YES];
- (void)viewDidLoad {
[super viewDidLoad];
[self setExtraCellLineHidden:self.myTableViewW
[self initCellInfo];
[self initTableView];
[self initTitleBar];
[self initHeader];
[self initSearchBar];
- (void)initSearchBar{
self.mySearchController=[[UISearchController alloc]initWithSearchResultsController:nil];
self.mySearchController.searchBar.frame=CGRectMake(100, 10, 200, 44);
self.myTableViewW.tableHeaderView=self.mySearchController.searchB
[self.mySearchController.searchBar sizeToFit];
self.mySearchController.searchResultsUpdater=
self.mySearchController.dimsBackgroundDuringPresentation=NO;
self.mySearchController.hidesNavigationBarDuringPresentation=NO;
self.mySearchController.searchBar.placeholder=@&输入赤兔ID或者昵称查询&;
[self presentViewController:self.mySearchController animated:YES completion:nil];
- (void)initHeader{
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self hiddenkeyBoard];
- (void)hiddenkeyBoard{
[self.myTextField resignFirstResponder];
- (void)initTitleBar{
self.title=@&添加朋友&;
- (void)initCellInfo{
NSMutableArray *cellInfoArray=[[NSMutableArray alloc]init];
NSMutableArray *nickNameArray=[[NSMutableArray alloc]init];
NSMutableArray *IDArray=[[NSMutableArray alloc]init];
CellInfo_t *cellInfo=[self newCellInfo];
cellInfo.image=@&http://b./image/w%3D310/sign=a0eb5ed6d52abfdda3cc7cd98d10f00dbe2e233fb80e7aec90d0.jpg&;
cellInfo.nickName=@&呱呱呱&;
cellInfo.ID=@&1&;
[cellInfoArray addObject:cellInfo];
[nickNameArray addObject:cellInfo.nickName];
[IDArray addObject:cellInfo.ID];
cellInfo=[self newCellInfo];
cellInfo.image=@&http://c./image/w%3D310/sign=cb0ab62f63e/902397dda144aded2a20cf431ad853e.jpg&;
cellInfo.nickName=@&任溶溶&;
cellInfo.ID=@&2&;
[cellInfoArray addObject:cellInfo];
[nickNameArray addObject:cellInfo.nickName];
[IDArray addObject:cellInfo.ID];
cellInfo=[self newCellInfo];
cellInfo.image=@&/users/upfile/big.jpg&;
cellInfo.nickName=@&小安江湖&;
cellInfo.ID=@&3&;
[cellInfoArray addObject:cellInfo];
[nickNameArray addObject:cellInfo.nickName];
[IDArray addObject:cellInfo.ID];
cellInfo=[self newCellInfo];
cellInfo.image=@&http://d./image/w%3D310/sign=ebe80fb0baa1cd02fcafcc3cec3fd2c55.jpg&;
cellInfo.nickName=@&路见不平&;
cellInfo.ID=@&4&;
[cellInfoArray addObject:cellInfo];
[nickNameArray addObject:cellInfo.nickName];
[IDArray addObject:cellInfo.ID];
self.nickNameArray=nickNameA
self.cellInfoArray=cellInfoA
self.IDArray=IDA
- (CellInfo_t *)newCellInfo{
CellInfo_t *info=[CellInfo_t new];
- (void)initTableView{
self.myTableViewW.delegate=
self.myTableViewW.dataSource=
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (self.mySearchController.active){
return self.searchList.
return self.cellInfoArray.
- (CellInfo_t *)getCellInfo:(NSInteger)row{
return self.cellInfoArray[row];
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 80;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CellInfo_t *cellInfo=[self getCellInfo:indexPath.row];
static NSString *cellID=@&RRAddFriendCell&;
RRAddFriendCell *cell=[tableView dequeueReusableCellWithIdentifier:cellID];
if (cell==nil) {
cell=[[[NSBundle mainBundle]loadNibNamed:cellID owner:self options:nil]lastObject];
if(self.mySearchController.active){
cell.mynickName=self.searchList[indexPath.row];
PAImageView *image=[[PAImageView alloc]initWithFrame:cell.myimage.bounds backgroundProgressColor:[UIColor lightGrayColor] progressColor:nil image:nil];
[cell.myimage addSubview:image];
[image setImageURL:cellInfo.image];
cell.mynickName=cellInfo.nickN
cell.myID=cellInfo.ID;
[cell.myapplyAdd setTitle:@&申请添加& forState:UIControlStateNormal];
[cell.myapplyAdd addTarget:self action:@selector(applyAdd) forControlEvents:UIControlEventTouchUpInside];
cell.selectionStyle=UITableViewCellSelectionStyleN
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{
return YES;
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController{
NSString *searchString = self.mySearchController.searchBar.
NSPredicate *preicate = [NSPredicate predicateWithFormat:@&SELF CONTAINS[c] %@&, searchString];//用predicateWithFormat创建一个谓词,name作为键路径
if (self.searchList!= nil) {
[self.searchList removeAllObjects];
//过滤数据
self.searchList= [NSMutableArray arrayWithArray:[self.nickNameArray filteredArrayUsingPredicate:preicate]];
[self.myTableViewW reloadData];
- (void)applyAdd{
NSLog(@&申请添加&);
- (void)setExtraCellLineHidden: (UITableView *)tableView{
UIView *view =[ [UIView alloc]init];
view.backgroundColor = [UIColor clearColor];
[tableView setTableFooterView:view];
[tableView setTableHeaderView:view];
-(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar{
[searchBar endEditing:YES];
return YES;
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
[searchBar endEditing:YES];&&国之画&&布布分享&&&& &&&&
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 ios开发单例保存数组 的文章

 

随机推荐