1. 程式人生 > >利用tableView分組實現省份各個城市的分組,利用首字母作為索引

利用tableView分組實現省份各個城市的分組,利用首字母作為索引

- (void)viewDidLoad {

    [superviewDidLoad];

    [self_loadData];

    [self_initSubView];

}

#pragma mark - 載入資料

- (void)_loadData{

//1 讀取資料

NSString * path=[[NSBundlemainBundle]pathForResource:@"cities.plist"ofType:nil];

NSDictionary * dic=[NSDictionarydictionaryWithContentsOfFile:path];  

//2 封裝省份和首字母

   NSArray * prov=dic[@"provinces"];

   for(NSString * strin prov){

JRProvince * pro=[JRProvincegetProWithName:str];

        [self.provinceaddObject:pro];

    }  

//3 封裝地市

   self.cities=dic[@"cities"];

}

- (void)_initSubView{ 

UITableView * tableView=[[UITableViewalloc]initWithFrame:CGRectMake(0, 20,

self.view.frame.size.width,self.view.frame.size.height-20)style:UITableViewStylePlain];

    tableView.delegate=self;

    tableView.dataSource=self;

    tableView.sectionFooterHeight=0;//設定尾部高度為0

   self.tableView=tableView;

    [self.viewaddSubview:tableView];

}

#pragma mark - UITableViewDataSource

//返回行數

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

//由省份計算每個省份的地市個數

   JRProvince * pro=self.province[section];

   NSArray * temArray=self.cities[pro.name];

   return temArray.count;

}

//返回分組的數量

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

returnself.province.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  

   static NSString * identy=@"myTable";

UITableViewCell * cell=[tableViewdequeueReusableCellWithIdentifier:identy ];

   if(cell==nil){

        cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:identy];

        cell.selectionStyle=UITableViewCellSelectionStyleDefault;

    }

//根據省份獲取城市列表,並且根據索引返回對應城市

   JRProvince * pro=self.province[indexPath.section];

   NSArray * temArray=self.cities[pro.name];

    cell.textLabel.text=temArray[indexPath.row];

   return cell;

}

//返回分組標題

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

   JRProvince * pro=self.province[section];

   return pro.name;

}

//返回分組索引

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{

//迴圈遍歷省份的陣列,返回對應首字母作為索引

NSMutableArray * indexArray=[NSMutableArrayarray];

for(JRProvince * proinself.province){

       //防止重複新增

if(![indexArraycontainsObject:[NSStringstringWithFormat:@"%c",pro.pinyin]]){

            [indexArray addObject:[NSStringstringWithFormat:@"%c",pro.pinyin]];

        }

    }

   return indexArray;

}

#pragma mark * 由於重複未新增的索引指向--第一次新增的首字母

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index{

   int tem=0;

for(JRProvince * proinself.province){

       if(pro.pinyin==[titlecharacterAtIndex:0]){

           break;

        }

        tem++;

    }

   return tem;

}

#pragma mark * 選中cell,跳轉到cell組名在最頂端

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

NSIndexPath * index=[NSIndexPathindexPathForRow:0 inSection:indexPath.section];

    [self.tableViewscrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionTopanimated:YES];

}

//返回城市列表的首字母

+ (JRProvince * )getProWithName:(NSString * )name{

   JRProvince * pro=[[JRProvincealloc]init];

    pro.name=name;

//由於該工具類不能識別多音字,因此對重慶特殊處理

   if([name isEqualToString:@"重慶"]){

        pro.pinyin='C';

    }else{

        pro.pinyin=pinyinFirstLetter([namecharacterAtIndex:0])-32;

    } 

   return pro;

}