百度 IOS搜索栏 你会找到很多关于IOS8之前的搜索实现demo和案例。当前官方已经不推荐了,既然如此 就是用官方推荐的吧。致于优点什么的 自己百度吧。
如果你觉得无所谓可以忽略我的废话。代码中也有说明的[细节住处注意红色的代码]。
需要特别说明一下,在我测试的时候出现了一个bug:
当我的搜索栏处于编辑状态的时候,我切换了控制器。直接导致搜索栏显示在我切换后的控制器的界面上了。对此我感到很纳闷。因为在我切换控制器的时候,我之前的搜索栏所在的控制器已经释放了,但是搜索栏却依然存在于切换后的控制器界面上。我试着在viewWillDisapear中将搜索栏等属性置空 或者从其supperView中remove,依然还是重现了我上述的bug。综上我感觉这个搜索栏控制器因为不是有其所在界面的控制器管理的。
对于上面描述的bug 造成的直接原因就是 当我的搜索栏处于编辑状态的时候 我直接就切换了控制器。如果要避免这个bug 可以设置搜索栏的蒙板 或者设置编辑搜索栏时隐藏状态栏和导航条。这样在切换控制器的时候 必须退出搜索栏的编辑才能切换。
下面是我的demo, 随机生成100个cell的数据源 内容格式为 0~99+三个英语字母
@interface SearchVC ()<UITableViewDataSource, UISearchControllerDelegate, UISearchResultsUpdating>
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) UISearchController *searchController;
//数据源
@property (nonatomic, strong) NSMutableArray *dataList;
@property (nonatomic, strong) NSMutableArray *searchList;
@end
@implementation SearchVC
- (void)viewDidLoad
{
[super viewDidLoad];
[self initSearchUIAndData];
}
//在视图即将消失的时候释放资源,不然搜索栏会一值停留在洁面上[应该是添加到窗口上了,因为控制器已经释放了]
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)initSearchUIAndData
{
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = @"搜索IOS8之后";
//初始化数据源
_dataList = [NSMutableArray array];
_searchList = [NSMutableArray array];
self.dataList = [NSMutableArray arrayWithCapacity:100];//容量
//产生100个“数字+三个随机字母”
for (NSInteger i = 0; i < 100; i++)
{
[self.dataList addObject:[NSString stringWithFormat:@"%ld%@",(long)i,[self shuffledAlphabet]]];
}
_tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)];
//设置代理
// _tableView.delegate = self;
_tableView.dataSource = self;
_tableView.separatorStyle = UITableViewCellSelectionStyleNone;//取消分割线
//创建UISearchController
_searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
//设置代理
_searchController.delegate = self;
_searchController.searchResultsUpdater = self;
//设置UISearchController的显示属性,以下3个属性默认为YES
//搜索时,背景变暗色
// _searchController.dimsBackgroundDuringPresentation = NO;
//搜索时,背景变模糊
// _searchController.obscuresBackgroundDuringPresentation = 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);
// 添加 searchbar 到 headerview
self.tableView.tableHeaderView = _searchController.searchBar;
[self.view addSubview:_tableView];
}
//生成三个随机字母
- (NSString *)shuffledAlphabet
{
NSMutableArray * shuffledAlphabet = [NSMutableArray arrayWithArray:@[@"A",@"B",@"C",@"D",@"E",@"F",@"G",
@"H",@"I",@"J",@"K",@"L",@"M",@"N",
@"O",@"P",@"Q",@"R",@"S",@"T",@"U",
@"V",@"W",@"X",@"Y",@"Z"]];
NSString *strTest = [[NSString alloc]init];
for (int i = 0; i < 3; i++)
{
int x = arc4random() % 25;//0~24 的随机数
strTest = [NSString stringWithFormat:@"%@%@",strTest,shuffledAlphabet[x]];
}
return strTest;
}
#pragma mark - UITableViewDataSource
//table 返回的行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (self.searchController.active)//如果正在搜索
{
return [self.searchList count];
}
else
{
return [self.dataList count];
}
}
//返回单元格内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *flag = @"cell";
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]];
}
else//如果没有搜索
{
[cell.textLabel setText:self.dataList[indexPath.row]];
}
return cell;
}
#pragma mark - UISearchControllerDelegate
//测试UISearchController的执行过程
- (void)willPresentSearchController:(UISearchController *)searchController
{
NSLog(@"willPresentSearchController");
}
- (void)didPresentSearchController:(UISearchController *)searchController
{
NSLog(@"didPresentSearchController");
}
- (void)willDismissSearchController:(UISearchController *)searchController
{
NSLog(@"willDismissSearchController");
}
- (void)didDismissSearchController:(UISearchController *)searchController
{
NSLog(@"didDismissSearchController");
}
- (void)presentSearchController:(UISearchController *)searchController
{
NSLog(@"presentSearchController");
}
-(void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
NSLog(@"updateSearchResultsForSearchController");
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];
}
- (void)dealloc
{
[Tools NSLogClassDestroy:self];
_tableView = nil;
_searchController = nil;
_dataList = nil;
_searchList = nil;
}
@end
界面效果:
这是一个有bug的 图片
这是修复bug之后的界面效果: