iOS通讯录联系人字母索引的实现

Demo展示

  • 图片展示tableViewController的每一个section的title, 右方是字母索引列表; iOS会根据不同的语言,字母也相应改变. 比如,日语就包含了平假名. 中文和英文默认都是A-Z和#.

  • 点击右边字母索引, table跳相应section,并修改section的标题

Alt text

实现方法

  • 创建一个sectionArray,用来保存section的索引序号和这个section包含的所有联系人. 层次如下:

    sectionArray[sectionIndex] -> N个联系人(Object)
    每个联系人(object)->人名,电话等信息

  • 创建一个collation

    代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 定义上面说到的2个私有属性: 
@interface PhoneBookTableViewController ()
@property(nonatomic,strong) UILocalizedIndexedCollation *collation;
@property (nonatomic,strong) NSMutableArray *sectionArray;
@end

- (void) setUpTableSection {
// 获取包含A-Z和#的collation class
self.collation = [UILocalizedIndexedCollation currentCollation];

//tableView section的的数目等于 collation的title(这里有27个section: A-Z,#)
NSUInteger numberOfSections = [[self.collation sectionTitles] count];

// 创建一个新的 newSectionArray, 最后复制给sectionArray
NSMutableArray *newSectionArray = [[NSMutableArray alloc]init];
// 定义sectionArray的层次
for (NSUInteger index = 0; index<numberOfSections; index++) {
[newSectionArray addObject:[[NSMutableArray alloc]init]];
}

// insert Persons info into newSectionArray
//按照person的name划分section, 即"艾"姓的,划分到A section
for (Person * person in self.persons) {
NSUInteger sectionIndex = [self.collation sectionForObject:person collationStringSelector:@selector(name)];
[newSectionArray[sectionIndex] addObject:person];
}

//sort the person of each section
// 对每个section的persons 进行排序
for (NSUInteger index=0; index<numberOfSections; index++) {
NSMutableArray *personsForSection = newSectionArray[index];
NSArray *sortedPersonsForSection = [self.collation sortedArrayFromArray:personsForSection collationStringSelector:@selector(name)];
newSectionArray[index] = sortedPersonsForSection;
}
self.sectionArray = newSectionArray;

}
  • tableViewController其他的方式实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// sections数目等于collation的索引字母数目
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[self.collation sectionTitles]count];
}

//每个section的人数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.sectionArray[section] count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellForPerson" forIndexPath:indexPath];

NSUInteger section = indexPath.section;
NSUInteger row = indexPath.row;
Person *person = self.sectionArray[section][row];
cell.textLabel.text = [NSString stringWithFormat:@"%@",person.name];
return cell;
}

// tableView的标题栏,最上方
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return [self.collation sectionTitles][section];
}


// tableView向collation请求索引的字母列表数组
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return [self.collation sectionIndexTitles];
}

Demo代码下载

已push到github上面.

本文如对你有帮助,请鼓励下!