iOS - 搜索框UISearchController的使用(iOS8.0之后替代UISearchBar + UISearchDisplayController的组合)
2016-01-12 23:23
731 查看
原文链接:http://www.myexception.cn/operating-system/1962382.html
iOS --- 搜索框UISearchController的使用(iOS8.0以后替代UISearchBar + UISearchDisplayController的组合)
在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISearchDisplayController的组合方式.
UISearchController的searchBar中的内容一旦发生变化, 就会调用该方法. 在其中, 我们可以使用NSPredicate来设置搜索过滤的条件.
这一点, 可以通过UISearchController的active属性来判断, 即判断输入框是否处于active状态.
UITableView相关的很多方法都要根据active来做判断:
iOS --- 搜索框UISearchController的使用(iOS8.0以后替代UISearchBar + UISearchDisplayController的组合)
在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISearchDisplayController的组合方式.
添加UISearchController属性:
@property(strong, nonatomic) UISearchController *searchController; @property(strong, nonatomic) NSMutableArray *allCities; // 所有城市 @property(strong, nonatomic) NSMutableArray *filteredCities; // 根据searchController搜索的城市
UISearchController初始化
在viewDidLoad中初始化UISearchController:self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; self.searchController.searchResultsUpdater = self; self.searchController.dimsBackgroundDuringPresentation = false; [self.searchController.searchBar sizeToFit]; self.searchController.searchBar.backgroundColor = UIColorFromHex(0xdcdcdc); self.tableView.tableHeaderView = self.searchController.searchBar;
UISearchResultsUpdating协议
使用UISearchController要继承UISearchResultsUpdating协议, 实现其中的UISearchResultsUpdating方法.#pragma mark - searchController delegate - (void)updateSearchResultsForSearchController:(UISearchController *)searchController { [self.filteredCities removeAllObjects]; NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", self.searchController.searchBar.text]; self.filteredCities = [[self.allCities filteredArrayUsingPredicate:searchPredicate] mutableCopy]; dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); }
UISearchController的searchBar中的内容一旦发生变化, 就会调用该方法. 在其中, 我们可以使用NSPredicate来设置搜索过滤的条件.
更新UITableView
引入UISearchController之后, UITableView的内容也要做相应地变动: 即cell中要呈现的内容是allCities, 还是filteredCities.这一点, 可以通过UISearchController的active属性来判断, 即判断输入框是否处于active状态.
UITableView相关的很多方法都要根据active来做判断:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if (!self.searchController.active) { return self.cityKeys.count; } else { return 1; } } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (!self.searchController.active) { NSString *key = self.cityKeys[section]; NSArray *citySection = self.cityDict[key]; return citySection.count; } else { return self.filteredCities.count; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.selectionStyle = UITableViewCellSelectionStyleNone; } // 根据UISearchController的active属性来判断cell中的内容 if (!self.searchController.active) { NSString *key = self.cityKeys[indexPath.section]; cell.textLabel.text = [self.cityDict[key] objectAtIndex:indexPath.row]; } else { cell.textLabel.text = self.filteredCities[indexPath.row]; } return cell; }
UISearchController的移除
在viewWillDisappear中要将UISearchController移除, 否则切换到下一个View中, 搜索框仍然会有短暂的存在.- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (self.searchController.active) { self.searchController.active = NO; [self.searchController.searchBar removeFromSuperview]; } }
相关文章推荐
- UITableView的全部属性、方法以及代理方法执行顺序,常规的设置技巧
- UIScrollView 介绍
- iOS开发之UI篇第一回合
- bzoj4393【Usaco2015 Dec】Fruit Feast
- UITabBarController2
- UITabBarController
- UISwitch
- UISlider
- UISegmentedControl(分段控制器)
- UIProgressView(进度条)
- UIPickerView(选择框)
- UIScrollView(滑动视图)
- UIAlertController
- UIPageControl
- UIActionSheet
- UIAlertView(警告提示)
- UINavigationController(导航控制器)
- UIView
- UIActivityIndicatorView(菊花)
- Values of attribute "level" not equal in different manifest snippets.