搜索功能,基本每个app标配。
实现起来很简单,但是iOS8后苹果建议使用UISearchController,官方Demo:Table Search with UISearchController
实际开发基本也都还是用的老的UISearchDisplayController+UISearchBar的方案,因为要照顾一些版本低的用户。
发现时间长没写都忘记差不多了,闲暇之余,一起整理下,方便以后翻阅。
这篇先从UISearchDisplayController开始。比较简单,就不罗嗦了,直接贴代码。
- UITableView步骤略去。
- 新建一个UISearchBar
1 _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)]; 2 _searchBar.delegate = self; 3 _searchBar.placeholder = @"搜索"; 4 _searchBar.backgroundColor = [UIColor clearColor];
- 根据searchBar新建一个UISearchDisplayController
1 _searchDisplayCtl = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self]; 2 _searchDisplayCtl.delegate = self; 3 _searchDisplayCtl.searchResultsDataSource = self; 4 _searchDisplayCtl.searchResultsDelegate = self;
- 设置tableView的tableHearderView为searchBar
1 _tableView.tableHeaderView = _searchBar;
- 更改searchBar的Cancel按钮为“取消”,注意:因为iOS7后和之前的层次结构不同,iOS7前遍历一次即可拿到,iOS7后需要遍历两次,在UISearchBar的代理方法中设置
1 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 2 { 3 for (id sView in searchBar.subviews) 4 { 5 if ([sView isKindOfClass:[UIButton class]]) 6 { 7 [(UIButton *)sView setTitle:@"取消" forState:UIControlStateNormal]; 8 break; 9 } 10 for (id ssView in [sView subviews]) 11 { 12 if ([ssView isKindOfClass:[UIButton class]]) 13 { 14 [(UIButton *)ssView setTitle:@"取消" forState:UIControlStateNormal]; 15 } 16 } 17 } 18 19 // 默认只要已进入搜索状态,cancel按钮就会出现, 20 // 但是不知道为什么有时候没出来,严谨性,我们就自己加上下面这段。 21 [searchBar setShowsCancelButton:YES animated:YES]; 22 }
- 最后一步,搜索展示结果。UISearchDisplayController代理中处理
1 #pragma mark - UISearchDisplayController 2 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 3 { 4 [_resultList removeAllObjects]; 5 6 for (NSString *subString in _dataList) 7 { 8 if ([subString rangeOfString:searchString].location != NSNotFound) 9 { 10 [_resultList addObject:subString]; 11 } 12 } 13 14 return YES; 15 }
最简便的一个搜索完成了,UISearchBar和UISearchDisplayController还提供给我们很多其他的代理方法,都是些常规读名取意型的,就不一一介绍了,实际用到了看下就可以了。苹果封装的已经很好,而且UI也蛮漂亮的,所以我们也没必要自己写一个。
不过,实际过程中有两点可能会用到。网上也挺多资料,大概整理下。方便以后查找使用。
- 更改UISearchBar的背景
项目中可能会有需要我们改变其背景颜色或者背景图片的需求,其大概实现原理类似更改cancel按钮的title。需要注意的还是iOS版本不同,层次结构不同
- 关于ScopeBar
时间: 2024-10-06 20:40:12