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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值