iOS tableView实现搜索功能
本文实例为大家分享了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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)