IOS中获取本地通讯录联系人以及汉字首字母排序

2025-05-29 0 27

iOS中获取手机通讯录中的联系人信息:

?

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

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92
/*** 加载本地联系人*/

- (void)loadLocalContacts

{

//新建一个通讯录类

ABAddressBookRef addressBooks = nil;

if (DeviceVersion < 6.0) {

addressBooks = ABAddressBookCreate();

} else {

addressBooks = ABAddressBookCreateWithOptions(NULL, NULL);

//获取通讯录权限

dispatch_semaphore_t sema = dispatch_semaphore_create(0);

ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

dispatch_release(sema);

}

//判断授权状态

if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) {

return ;

}

//获取通讯录中的所有人

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);

//通讯录中人数

CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);

NSMutableArray *persons = [[NSMutableArray alloc] init];

for (int i = 0; i < nPeople; i++) {

//获取个人

ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);

//获取个人名字

NSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);

NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

NSMutableString *name = [[NSMutableString alloc] init];

if (firstName == nil && lastName == nil) {

NSLog(@"名字不存在的情况");

name = nil;

}

if (lastName) {

[name appendString:lastName];

}

if (firstName) {

[name appendString:firstName];

}

ABMultiValueRef tmlphone = ABRecordCopyValue(person, kABPersonPhoneProperty);

NSString *telphone = (NSString *)ABMultiValueCopyValueAtIndex(tmlphone, 0);

if (telphone != nil) {

telphone = [telphone stringByReplacingOccurrencesOfString:@"-" withString:@""];

NSString *title = [NSString stringWithFormat:@"%@(%@)",name,telphone];

[persons addObject:title];

}

}

//对联系人进行分组和排序

UILocalizedIndexedCollation *theCollation = [UILocalizedIndexedCollation currentCollation];

NSInteger highSection = [[theCollation sectionTitles] count]; //中文环境下返回的应该是27,是a-z和#,其他语言则不同

//_indexArray 是右侧索引的数组,也是secitonHeader的标题

_indexArray = [[NSMutableArray alloc] initWithArray:[theCollation sectionTitles]];

NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:highSection];

//初始化27个空数组加入newSectionsArray

for (NSInteger index = 0; index < highSection; index++) {

NSMutableArray *array = [[NSMutableArray alloc] init];

[newSectionsArray addObject:array];

[array release];

}

for (NSString *p in persons) {

//获取name属性的值所在的位置,比如"林丹",首字母是L,在A~Z中排第11(第一位是0),sectionNumber就为11

NSInteger sectionNumber = [theCollation sectionForObject:p collationStringSelector:@selector(getFirstLetter)];

//把name为“林丹”的p加入newSectionsArray中的第11个数组中去

NSMutableArray *sectionNames = newSectionsArray[sectionNumber];

[sectionNames addObject:p];

}

for (int i = 0; i < newSectionsArray.count; i++) {

NSMutableArray *sectionNames = newSectionsArray[i];

if (sectionNames.count == 0) {

[newSectionsArray removeObjectAtIndex:i];

[_indexArray removeObjectAtIndex:i];

i--;

}

}

//_contacts 是联系人数组(确切的说是二维数组)

self.contacts = newSectionsArray;

[newSectionsArray release];

[self.tableView reloadData];

}

顺便把索引和tableView dataSource的代理方法也贴一下:

?

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
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return self.contacts.count;

}

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

{

return [self.contacts[section] count];

}

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

{

static NSString *identifier = @"contactCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

if (cell == nil) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

}

cell.imageView.image = [UIImage imageNamed:@"default_head"];

cell.textLabel.text = [self.contacts objectAtIndex:indexPath.section][indexPath.row];

return cell;

}

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

{

return [_indexArray objectAtIndex:section];

}

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

{

return _indexArray;

}

//索引列点击事件

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

{

return index;

}

还有两个很重要的方法:

下面这个方法是[theCollation sectionForObject:p collationStringSelector:@selector(getFirstLetter)]; 是这里的p对象要实现的方法,我这里的p是NSString,你也可以用其他对象例如Person。

?

1

2

3

4

5

6

7

8

9

10

11
NSString *ret = @"";

if (![self canBeConvertedToEncoding: NSASCIIStringEncoding]) {//如果是英语

if ([[self letters] length]>2) {

ret = [[self letters] substringToIndex:1];

}

}

else {

ret = [NSString stringWithFormat:@"%c",[self characterAtIndex:0]];

}

return ret;

}

下面这个方法是NSString得类别方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16
- (NSString *)letters{

NSMutableString *letterString = [NSMutableString string];

int len = [self length];

for (int i = 0;i < len;i++)

{

NSString *oneChar = [[self substringFromIndex:i] substringToIndex:1];

if (![oneChar canBeConvertedToEncoding:NSASCIIStringEncoding]) {

NSArray *temA = makePinYin2([oneChar characterAtIndex:0]);

if ([temA count]>0) {

oneChar = [temA objectAtIndex:0];

}

}

[letterString appendString:oneChar];

}

return letterString;

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 IOS中获取本地通讯录联系人以及汉字首字母排序 https://www.kuaiidc.com/91802.html

相关文章

发表评论
暂无评论