首页 > 代码库 > ios UITableView 搜索
ios UITableView 搜索
自己实现 UITableView 搜索,相对于使用 UISearchDisplayController 来说自己写稍微麻烦了那么一点点,但是更加灵活。主要就是用一个字段区分出当前是搜索还是非搜索,然后 reload 相应的 data 就行了,和 UISearchDisplayController 的实现也很像,不过 UISearchDisplayController是两个 tableview 切换,这里我们是一个 tableview load 不同的数据。
关键代码:
@interface MainTableViewController : UIViewController<UISearchBarDelegate,UITableViewDelegate,UITableViewDataSource>{ UITableView *mytableView; NSArray *data; NSMutableArray *filterData; BOOL isFiltered; // 标识是否正在搜素 UIView *mask;}
- (void)viewDidLoad{ [super viewDidLoad]; mytableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height-20)]; mytableView.dataSource = self; mytableView.delegate = self; [self.view addSubview:mytableView]; UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width , 44)]; searchBar.placeholder = @"搜索"; searchBar.delegate = self; mytableView.tableHeaderView = searchBar; // 添加一层 mask mask = [[UIView alloc] initWithFrame:CGRectMake(0, 20 + 44, self.view.frame.size.width, self.view.frame.size.height -20 -44)]; [self.view addSubview:mask]; mask.backgroundColor = [UIColor blackColor]; mask.alpha = 0;}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ // 通过 isFiltered 区分出当前显示的是搜索结果集还是原结果集 if (isFiltered) { return filterData.count; } return data.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *cellid = @"cellid"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellid]; if (cell==nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellid]; } // 通过 isFiltered 区分出当前显示的是搜索结果集还是原结果集 if (isFiltered) { cell.textLabel.text = filterData[indexPath.row]; }else{ cell.textLabel.text = data[indexPath.row]; } return cell;}- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ // 开始搜索时弹出 mask 并禁止 tableview 点击 NSLog(@"searchBarTextDidBeginEditing"); isFiltered = YES; searchBar.showsCancelButton = YES; mask.alpha = 0.3; mytableView.allowsSelection = NO; mytableView.scrollEnabled = NO;}- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ NSLog(@"searchBarTextDidEndEditing");}- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ NSLog(@"textDidChange"); if (searchText.length == 0) { isFiltered = NO; mask.alpha = 0.3; mytableView.allowsSelection = NO; mytableView.scrollEnabled = NO; [mytableView reloadData]; return; } isFiltered = YES; mask.alpha = 0; mytableView.allowsSelection = YES; mytableView.scrollEnabled = YES; // 谓词搜索 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains [cd] %@",searchText]; filterData = [[NSMutableArray alloc] initWithArray:[data filteredArrayUsingPredicate:predicate]]; [mytableView reloadData];}- (void)searchBarCancelButtonClicked:(UISearchBar *) sb{ // 点击 cancel 时去掉 mask ,reloadData sb.text = @""; [sb setShowsCancelButton:NO animated:YES]; mytableView.allowsSelection = YES; mytableView.scrollEnabled = YES; [sb resignFirstResponder]; mask.alpha = 0; isFiltered = NO; [mytableView reloadData];}-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSString *text; if (isFiltered) { text = filterData[indexPath.row]; }else{ text = data[indexPath.row]; } NSLog(@"you click index:%d %@",indexPath.row,text);}
基于 ios7.1 布局写了一个 demo: http://pan.baidu.com/s/1ntn0MeP
ios UITableView 搜索
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。