月圆之夜,紫禁之巅,一剑西来,天外飞仙。

0%

iOS学习笔记--自定义通讯录

最近在项目中遇到这样一个问题,在自定义的通讯录中点击索引的时候对应的分组标题改变其状态(如改变其字体颜色、类型、字号等)。在网上找了很长时间但没找到可以使用的,这里有一个写的可以用的拿出来分享一下,写的不好还请见谅!

主要思路:

一、在工程中通过对数据源进行处理,使它们按照汉语拼音进行排序并按照拼音的第一个字母进行分组。

1
2
3
如:现在有数据源
self.tmpNameArr = [NSArray arrayWithObjects:@"Aorde",@"爱旅行的猫",@"张三丰",@"张道陵",@"李太白",@"八大山人",@"温庭筠",@"杜甫",@"王安石",@"李白",@"张三",@"重庆",@"重量",@"调节",@"调用",@"小白",@"小明",@"千珏",@"黄家驹", @"鼠标",@"hello",@"多美丽",@"肯德基",@"##",@"e才到家",@"方米",@"高明",@"icd",@"jeer",@"米杰",@"宁宁",@"盟们",@"彭明",@"任港南飞",@"他宝宝",@"袁浩",nil];
将它们进行分组后,建立2个数组,一个是排序后出现过得品应首字母数组也就是索引数组(indexArray),一个是排序号的结果数组(letterResultArr)。在这里排序分组用到了网上的ZYPinYinSearchLib 和 BMChineseStringSort。

二、用tableView来展示

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//section的titleHeader
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

return self.indexArray[section];
}
//section的titleHeader的高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return MDXFrom6(15);
}
//section行数
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

return self.indexArray.count;

}
//每组section个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

return [self.letterResultArr[section] count];

}
//section右侧index数组
//右侧索引列表
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return self.indexArray;
}
-(UITableViewCell * )tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * tongXunLuID = @"tongXunLuID";

tongXuLuTableViewCell * tongXunLuCell = [tableView dequeueReusableCellWithIdentifier:tongXunLuID];

if (!tongXunLuCell)
{
tongXunLuCell = [[tongXuLuTableViewCell alloc]initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:tongXunLuID];

tongXunLuCell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Person *p = [[self.letterResultArr objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

[tongXunLuCell.tmpNameLabel setText:[NSString stringWithFormat:@"%@",p.name]];
return tongXunLuCell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return MDXFrom6(49);
}
#pragma mark -- tableView点击事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{//这里是tableViewcell 的点击事件
}

三、点击索引时改变对应section的状态

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
定义一个数组arr,在数据源分组完成后初始化并赋值
self.arr = [NSMutableArray array];
for (NSInteger i=0; i<self.letterResultArr.count; i++)
{
[self.arr addObject:@"1"];
}
设置滑动代理
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
[self.arr removeAllObjects];
for (NSInteger i=0; i<self.letterResultArr.count; i++) {

[self.arr addObject:@"1"];
}
}
设置点击索引的操作
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index{

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:index] atScrollPosition:UITableViewScrollPositionTop animated:YES];

[tableView reloadData];
NSMutableArray *ar = [NSMutableArray arrayWithArray:self.arr];
[self.arr removeAllObjects];

//标记
for (NSInteger i=0; i<ar.count; i++)
{
if (i == index)
{
[self.arr addObject:@"2"];
}
else
{
[self.arr addObject:@"1"];
}

}
return index;
}

在自定义的view中改变状态
//section 自定义
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView* myView = [[UIView alloc] init];
myView.backgroundColor = RGB_Color(255, 255, 255);
self.sectionLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, KDeviceWidth, MDXFrom6(15))];
self.sectionLabel.textColor=[UIColor blackColor];
self.sectionLabel.backgroundColor = RGB_Color(181, 181, 181);
[self.sectionLabel setTextAlignment:NSTextAlignmentCenter];
self.sectionLabel.text=[self.indexArray objectAtIndex:section];


NSString *mod = self.arr[section];
if ([mod integerValue] == 2)
{
[self.sectionLabel setTextColor:[UIColor redColor]];
}
[myView addSubview:self.sectionLabel];

return myView;
}