虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > IOS编程/Objective-C > iOS tableView实现搜索功能

iOS tableView实现搜索功能
类别:IOS编程/Objective-C   作者:码皇   来源:互联网   点击:

这篇文章主要为大家详细介绍了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

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

您可能感兴趣的文章:

  • iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码
  • iOS tableview实现简单搜索功能
相关热词搜索: ios tableView 搜索