UISearchController的简单实用
2016-02-19 11:21
351 查看
iOS --- 搜索框UISearchController的使用(iOS8.0以后替代UISearchBar + UIS
在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]; } }
相关文章推荐
- UIDocumentInteractionController 第三方应用中打开自己的文件 方法
- Java Map 按key排序和按Value排序
- UiAutomator2自动化测试环境搭建
- Android学习路线(二十)运用Fragment构建动态UI
- 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用
- 关于EasyUI Datagrid JSON对象内嵌对象的取值问题
- android 键盘弹起 UI上移
- java.lang.ClassNotFoundException: filter.FiltrateRequestParamterFilter
- UITableView拉伸效果
- Android SDK Tools Platform-tools Build-tools
- state/ui-router
- 实现easyui的datagrid导出为excel
- 使用UIBezierPath和CAShapeLayer画各种图形 (转)
- HUE配置
- Supervised Sequence Labelling with Recurrent Neural Networks
- requestAnimationFrame,Web中写动画的另一种选择
- 安装及使用yuicompressor
- 用UIPikerView封装自己的UIDatePicker
- onkeyup="this.value=this.value.replace(/\D/g,'')
- cmd.ExecuteNonQuery();和cmd.ExecuteScalar();