当前位置: 移动技术网 > 移动技术>移动开发>IOS > iOS tableView实现搜索功能

iOS tableView实现搜索功能

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例为大家分享了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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网