zoukankan      html  css  js  c++  java
  • iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)

    在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];
      }
    }
  • 相关阅读:
    Infopath Notify 弹出提示信息
    window.showModalDialog 返回值
    【转】获得正文内容中的所有img标签的图片路径
    Json Datable Convert
    Sharepoint 列表 附件 小功能
    Surgey 权限更改
    SQL 触发器用于IP记录转换
    Caml语句 查询分配给当前用户及当前组
    jquery 1.3.2 auto referenced when new web application in VSTS2010(DEV10)
    TFS diff/merge configuration
  • 原文地址:https://www.cnblogs.com/rglmuselily/p/5339946.html
Copyright © 2011-2022 走看看