UI_搜索框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];  
  }  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值