首页 > 系统 > iOS > 正文

iOS tableView实现搜索功能

2020-07-26 02:36:42
字体:
来源:转载
供稿:网友

本文实例为大家分享了tableView搜索功能的具体代码,供大家参考,具体内容如下

框架:https://github.com/honeycao/HCSortAndSearchDemo

github里面有详细的说明

支持中文排序

#import "ChineseToPinyin.h"#import "HCSortString.h"#import "WLCCityTVC.h"#import "WLCProvinceModel.h"#import "ZYPinYinSearch.h"#define reusedID @"cityCell"@interface WLCCityTVC () <UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating>/** * 存放城市字典的数组,后来也存放排序后的 */@property (nonatomic, strong) NSMutableArray* cityArrM;@property (nonatomic, strong) WLCUser* user;/** * 存放首字母的数组 */@property (nonatomic, strong) NSMutableArray* letterArrM;@property (nonatomic, strong) NSMutableArray* wordArr;/** * 存放城市模型的数组 */@property (nonatomic, strong) NSMutableArray* modelArrM;@property (strong, nonatomic) NSMutableArray* searchDataSource; /**<搜索结果数据源*/@property (strong, nonatomic) UISearchController* searchController;@end@implementation WLCCityTVC- (void)viewDidLoad{ [super viewDidLoad]; [self setupUI];}#pragma mark - navitionBarBackBarItem返回事件- (BOOL)navigationShouldPopOnBackButton{ self.searchController.active = NO; return YES;}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}- (WLCUser*)user{ if (nil == _user) {  _user = [NSKeyedUnarchiver unarchiveObjectWithFile:fileUser]; } return _user;}- (NSMutableArray*)cityArrM{ if (nil == _cityArrM) {  _cityArrM = [NSMutableArray array]; } return _cityArrM;}- (NSMutableArray*)wordArr{ if (nil == _wordArr) {  _wordArr = [NSMutableArray array]; } return _wordArr;}- (NSMutableArray*)letterArrM{ if (nil == _letterArrM) {  _letterArrM = [NSMutableArray array]; } return _letterArrM;}- (UISearchController*)searchController{ if (!_searchController) {  _searchController = [[UISearchController alloc] initWithSearchResultsController:nil];  _searchController.searchResultsUpdater = self;  _searchController.dimsBackgroundDuringPresentation = NO;  _searchController.hidesNavigationBarDuringPresentation = NO;  _searchController.searchBar.placeholder = @"搜索";    _searchController.searchBar.tintColor = [UIColor whiteColor];  [_searchController.searchBar sizeToFit]; } return _searchController;}- (NSMutableArray*)modelArrM{ if (nil == _modelArrM) {  _modelArrM = [NSMutableArray array];  for (NSArray* tempArr in self.cityArrM) {   for (NSDictionary* dict in tempArr) {    [WLCProvinceModel setupReplacedKeyFromPropertyName:^NSDictionary* {     return @{      @"pID" : @"id"     };    }];    WLCProvinceModel* model = [WLCProvinceModel objectWithKeyValues:dict];    [_modelArrM addObject:model];   }  } } return _modelArrM;}- (NSMutableArray*)searchDataSource{ if (nil == _searchDataSource) {  _searchDataSource = [NSMutableArray array]; } return _searchDataSource;}- (void)setupUI{ self.tableView.backgroundColor = [UIColor rgb:234 andGreen:234 andBlue:243]; [self getAllCities]; self.tableView.delegate = self; self.tableView.dataSource = self; self.tableView.tableFooterView = [[UIView alloc] init];}- (void)getAllCities{ NSString* url = [kURL stringByAppendingString:@"promary/"]; url = [url stringByAppendingString:self.cityID]; url = [url stringByAppendingString:@"/city"]; [SVProgressHUD showWithStatus:@"获取城市中"]; [NetRequestTool requestWithParamsDict:nil image:nil name:nil token:self.user.token value:nil hearerField:nil URL:url type:GET successBlock:^(AFHTTPRequestOperation* _Nonnull operation, id _Nonnull responseObject) {  NSString* errNum = [NSString stringWithFormat:@"%@", responseObject[@"errNum"]];  if ([errNum isEqualToString:@"1"]) {   [SVProgressHUD setMinimumDismissTimeInterval:2.5];   [SVProgressHUD showInfoWithStatus:[NSString stringWithFormat:@"%@", responseObject[@"retMsg"]]];   [self.navigationController popViewControllerAnimated:YES];  }  else {   [SVProgressHUD dismiss];   @try {    self.cityArrM = responseObject[@"retData"];    NSMutableArray* cityArrM = [NSMutableArray array];    for (NSMutableDictionary* cityDic in self.cityArrM) {     [cityArrM addObject:[cityDic objectForKey:@"name"]];     NSMutableDictionary* dictM = [NSMutableDictionary dictionaryWithDictionary:cityDic];     [self prepareCityListDatasourceWithArray:cityArrM andToDictionary:dictM];    }    self.cityArrM = [self sortArray:self.wordArr];   } @catch (NSException* exception) {   } @finally {    [self.tableView setTableHeaderView:self.searchController.searchBar];    [self.tableView reloadData];   }  } }  anderrorBlock:^(AFHTTPRequestOperation* _Nonnull operation, NSError* _Nonnull error) {   WLog(@"error == %@", error);   [SVProgressHUD showErrorWithStatus:@"获取省份失败,请稍后重试"];   [self.navigationController popViewControllerAnimated:YES];  }];}#pragma mark -排序城市- (void)prepareCityListDatasourceWithArray:(NSArray*)array andToDictionary:(NSMutableDictionary*)dic{ for (NSString* city in array) {  NSString* cityPinyin = [ChineseToPinyin pinyinFromChiniseString:city];  if ([city isEqualToString:@"重庆"]) {   cityPinyin = @"CHONGQING";  }  NSString* firstLetter = [cityPinyin substringWithRange:NSMakeRange(0, 1)];  if (![dic objectForKey:firstLetter]) {   //   NSMutableArray* arr = [NSMutableArray array];   //   [dic setValue:firstLetter forKey:@"letter"];   dic[@"letter"] = firstLetter;  }  if ([[dic objectForKey:firstLetter] containsObject:city]) {   return;  } } [self.wordArr addObject:dic]; //  [self.wordArr addObjectsFromArray:[[dic allValues] sortedArrayUsingSelector:@selector(compare:)]];}/** * 排序并按首字母分组 * * @param arrayToSort <#arrayToSort description#> * * @return <#return value description#> */- (NSMutableArray*)sortArray:(NSMutableArray*)arrayToSort{ NSMutableArray* arrayForArrays = [[NSMutableArray alloc] init]; //根据拼音对数组排序 NSArray* sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"letter" ascending:YES]]; //排序 [arrayToSort sortUsingDescriptors:sortDescriptors]; NSMutableArray* tempArray = nil; BOOL flag = NO; //分组 for (int i = 0; i < arrayToSort.count; i++) {  NSString* pinyin = [arrayToSort[i] objectForKey:@"letter"];  NSString* firstChar = [pinyin substringToIndex:1];  //  NSLog(@"%@",firstChar);  if (![self.letterArrM containsObject:[firstChar uppercaseString]]) {   [self.letterArrM addObject:[firstChar uppercaseString]];   tempArray = [[NSMutableArray alloc] init];   flag = NO;  }  if ([self.letterArrM containsObject:[firstChar uppercaseString]]) {   [tempArray addObject:arrayToSort[i]];   if (flag == NO) {    [arrayForArrays addObject:tempArray];    flag = YES;   }  } } return arrayForArrays;}//让cell下划线左对齐- (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath{ if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {  [cell setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)]; } if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {  [cell setPreservesSuperviewLayoutMargins:NO]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {  [cell setLayoutMargins:UIEdgeInsetsZero]; }}#pragma mark - tableView's delegate and datasource- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{ if (!self.searchController.active) {  return self.letterArrM.count; } else {  return 1; }}- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{ if (!self.searchController.active) {  return [self.cityArrM[section] count]; } else {  return self.searchDataSource.count; }}- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{ UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reusedID]; if (!cell) {  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedID]; } @try {  if (!self.searchController.active) {   NSDictionary* dict = self.cityArrM[indexPath.section][indexPath.row];   cell.textLabel.text = [NSString stringWithFormat:@"%@", dict[@"name"]];  }  else {   //   NSDictionary* dict = self.searchDataSource[indexPath.row];   WLCProvinceModel* model = self.searchDataSource[indexPath.row];   cell.textLabel.text = [NSString stringWithFormat:@"%@", model.name];  } } @catch (NSException* exception) { } @finally { } return cell;}- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section{ if (!self.searchController.active) {  return [self.letterArrM objectAtIndex:section]; } else  return nil;}- (NSArray*)sectionIndexTitlesForTableView:(UITableView*)tableView{ if (!self.searchController.active) {  return self.letterArrM; } else  return nil;}- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{ NSDictionary* dict; @try {  if (!self.searchController.active) {   dict = self.cityArrM[indexPath.section][indexPath.row];  }  else {   WLCProvinceModel* model = self.searchDataSource[indexPath.row];   dict = [NSDictionary dictionaryWithObjects:@[ model.name, model.pID ] forKeys:@[ @"name", @"id" ]];  }  [[NSNotificationCenter defaultCenter] postNotificationName:@"cityChoosed" object:self userInfo:dict]; } @catch (NSException* exception) { } @finally { } self.searchController.active = NO; [self.navigationController popToViewController:self.fatherVC animated:YES]; [tableView deselectRowAtIndexPath:indexPath animated:YES];}#pragma mark - UISearchDelegate- (void)updateSearchResultsForSearchController:(UISearchController*)searchController{ [self.searchDataSource removeAllObjects]; NSArray* ary = [NSArray new]; //对排序好的数据进行搜索 NSDictionary* allDataSource = [HCSortString sortAndGroupForArray:self.modelArrM PropertyName:@"name"]; ary = [HCSortString getAllValuesFromDict:allDataSource]; if (searchController.searchBar.text.length == 0) {  [self.searchDataSource addObjectsFromArray:ary]; } else {  ary = [ZYPinYinSearch searchWithOriginalArray:ary andSearchText:searchController.searchBar.text andSearchByPropertyName:@"name"];  [self.searchDataSource addObjectsFromArray:ary]; } [self.tableView reloadData];}@end

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表