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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容