美文网首页
tableView搜索功能

tableView搜索功能

作者: 大热天晒太阳 | 来源:发表于2017-06-01 12:25 被阅读15次

    框架: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
    

    相关文章

      网友评论

          本文标题:tableView搜索功能

          本文链接:https://www.haomeiwen.com/subject/amasfxtx.html