UISearchController(使用)
阅读原文时间:2023年07月11日阅读:1

效果图1

效果图2

其实一般是在第一种情况使用的UISearchController,但是第二种情况这种又懒得去用uisearchbar+uitableview等等去处理,

其实主要是对数据源的合理使用即可

UISearchController通常是用来排查数据的,比如当前的uitableviewcontroller有许多数据,排查之后需要更新显示数据。

首先UISearchController是联通主cntroller与结果controller桥梁

在主controller建立UISearchController对象

@interface UIViewControllerLocation ()
{
UISearchController* searchController0;
}

那么如何联通主controller

CGRect rectBar=CGRectMake(0, 0, self.view.frame.size.width, 44);

[searchController0.searchBar setFrame:rectBar];

[self.searchBar addSubview:searchController0.searchBar];

以上代码需要理解的是searchController0.searchBar是一个只读属性,所以不能被assign,

self.searchBar是一个view

/**
* 搜索框
*/
@property (weak, nonatomic) IBOutlet UIView *searchBar;

不能够直接使用(UISearchBar)self.searchBar=searchController0.searchBar;只有tableview.tableHeaderView=searchController0.searchBar才有效果,同样是view不知道为什么
还有比较重要的一点就是,即使模拟器可以正常的显示,但是真机却无法显示searchBar(xcode7+iphone5s+ios8.3)
最终调试得出真机运行时searchController0.searchBar的frame是(0 0,0 0)需要重置frame才可以正常显示

那么如何联通结果controller

@interface UIViewControllerLocation ()
{
SearchResult* searchResult;
}

searchResult=\[SearchResult new\];  
searchController0=\[\[UISearchController alloc\] initWithSearchResultsController:searchResult\];

SearchResult是一个uitableviewcontroller
然后是主controller作为了结果controller的数据更新者

searchController0.searchResultsUpdater=self;

需要遵循一个代理

@interface UIViewControllerLocation : UIViewController

然后

 //设置活跃性为YES否则需要自行推送结果controller  
searchController0.active=YES;

那么主controller如何推送数据到 结果 controller

代理

/**
* 当搜索框开始改变时触发
*
* @param searchController
*/
-(void)updateSearchResultsForSearchController:(nonnull UISearchController *)searchController
{
searchResult.getResult(@[@,@,@,@,@,@]);
}

结果controller需要处理接受到的数据(使用的block)

#import
#import "NSObjectDataSource.h"
/**
* 获取数据
*
* @param idData
*/
typedef void (^GetResult)(id idData);
@interface SearchResult : UIViewController
/**
* 获取数据的block
*/
@property(nonatomic,copy)GetResult getResult;
/**
* 查询数据列表
*/
@property (weak, nonatomic) IBOutlet UITableView *tabelview;
/**
* tableview的datasource代理
*/
@property(nonatomic,retain)NSObjectDataSource* dataSource;
@end

主controller里初始化结果controller的获取数据block

SearchResult\*\_\_weak weakSearchResult=searchResult;  
searchResult.getResult=^(NSArray\* array)  
{  
    weakSearchResult.dataSource.nsArrayModels=array;  
    \[weakSearchResult.tabelview reloadData\];  
};

在主controller里搜索更新时执行就可以了(只传递最终数据,数据的筛选需要自行处理)

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章