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

  1. /***  加载本地联系人*/
  2. - (void)loadLocalContacts
  3. {
  4. //新建一个通讯录类
  5. ABAddressBookRef addressBooks = nil;
  6. if (DeviceVersion < 6.0) {
  7. addressBooks = ABAddressBookCreate();
  8. } else {
  9. addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL);
  10. //获取通讯录权限
  11. dispatch_semaphore_t sema = dispatch_semaphore_create(0);
  12. ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});
  13. dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
  14. dispatch_release(sema);
  15. }
  16. //判断授权状态
  17. if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) {
  18. return ;
  19. }
  20. //获取通讯录中的所有人
  21. CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);
  22. //通讯录中人数
  23. CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);
  24. NSMutableArray *persons = [[NSMutableArray alloc] init];
  25. for (int i = 0; i < nPeople; i++) {
  26. //获取个人
  27. ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
  28. //获取个人名字
  29. NSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
  30. NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
  31. NSMutableString *name = [[NSMutableString alloc] init];
  32. if (firstName == nil && lastName == nil) {
  33. NSLog(@"名字不存在的情况");
  34. name = nil;
  35. }
  36. if (lastName) {
  37. [name appendString:lastName];
  38. }
  39. if (firstName) {
  40. [name appendString:firstName];
  41. }
  42. ABMultiValueRef tmlphone =  ABRecordCopyValue(person, kABPersonPhoneProperty);
  43. NSString *telphone = (NSString *)ABMultiValueCopyValueAtIndex(tmlphone, 0);
  44. if (telphone != nil) {
  45. telphone = [telphone stringByReplacingOccurrencesOfString:@"-" withString:@""];
  46. NSString *title = [NSString stringWithFormat:@"%@(%@)",name,telphone];
  47. [persons addObject:title];
  48. }
  49. }
  50. //对联系人进行分组和排序
  51. UILocalizedIndexedCollation *theCollation = [UILocalizedIndexedCollation currentCollation];
  52. NSInteger highSection = [[theCollation sectionTitles] count]; //中文环境下返回的应该是27,是a-z和#,其他语言则不同
  53. //_indexArray 是右侧索引的数组,也是secitonHeader的标题
  54. _indexArray = [[NSMutableArray alloc] initWithArray:[theCollation sectionTitles]];
  55. NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:highSection];
  56. //初始化27个空数组加入newSectionsArray
  57. for (NSInteger index = 0; index < highSection; index++) {
  58. NSMutableArray *array = [[NSMutableArray alloc] init];
  59. [newSectionsArray addObject:array];
  60. [array release];
  61. }
  62. for (NSString *p in persons) {
  63. //获取name属性的值所在的位置,比如"林丹",首字母是L,在A~Z中排第11(第一位是0),sectionNumber就为11
  64. NSInteger sectionNumber = [theCollation sectionForObject:p collationStringSelector:@selector(getFirstLetter)];
  65. //把name为“林丹”的p加入newSectionsArray中的第11个数组中去
  66. NSMutableArray *sectionNames = newSectionsArray[sectionNumber];
  67. [sectionNames addObject:p];
  68. }
  69. for (int i = 0; i < newSectionsArray.count; i++) {
  70. NSMutableArray *sectionNames = newSectionsArray[i];
  71. if (sectionNames.count == 0) {
  72. [newSectionsArray removeObjectAtIndex:i];
  73. [_indexArray removeObjectAtIndex:i];
  74. i--;
  75. }
  76. }
  77. //_contacts 是联系人数组(确切的说是二维数组)
  78. self.contacts = newSectionsArray;
  79. [newSectionsArray release];
  80. [self.tableView reloadData];
  81. }

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

[objc] view plain copy

  1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  2. {
  3. return self.contacts.count;
  4. }
  5. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  6. {
  7. return [self.contacts[section] count];
  8. }
  9. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  10. {
  11. static NSString *identifier = @"contactCell";
  12. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
  13. if (cell == nil) {
  14. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
  15. }
  16. cell.imageView.image = [UIImage imageNamed:@"default_head"];
  17. cell.textLabel.text = [self.contacts objectAtIndex:indexPath.section][indexPath.row];
  18. return cell;
  19. }
  20. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
  21. {
  22. return [_indexArray objectAtIndex:section];
  23. }
  24. - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
  25. {
  26. return _indexArray;
  27. }
  28. //索引列点击事件
  29. - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
  30. {
  31. return index;
  32. }

还有两个很重要的方法:

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

[objc] view plain copy

  1. - (NSString *)getFirstLetter {
  2. NSString *ret = @"";
  3. if (![self canBeConvertedToEncoding: NSASCIIStringEncoding]) {//如果是英语
  4. if ([[self letters] length]>2) {
  5. ret = [[self letters] substringToIndex:1];
  6. }
  7. }
  8. else {
  9. ret = [NSString stringWithFormat:@"%c",[self characterAtIndex:0]];
  10. }
  11. return ret;
  12. }

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

[objc] view plain copy

  1. - (NSString *)letters{
  2. NSMutableString *letterString = [NSMutableString string];
  3. int len = [self length];
  4. for (int i = 0;i < len;i++)
  5. {
  6. NSString *oneChar = [[self substringFromIndex:i] substringToIndex:1];
  7. if (![oneChar canBeConvertedToEncoding:NSASCIIStringEncoding]) {
  8. NSArray *temA = makePinYin2([oneChar characterAtIndex:0]);
  9. if ([temA count]>0) {
  10. oneChar = [temA objectAtIndex:0];
  11. }
  12. }
  13. [letterString appendString:oneChar];
  14. }
  15. return letterString;
  16. }

时间: 2024-10-05 04:55:45

iOS中获取本地通讯录联系人以及汉字首字母排序的相关文章

react-native按照汉字首字母排序

问题讨论详情:https://github.com/facebook/react-native/issues/12597 问题描述: JS中有一个String的内置函数:String.prototype.localeCompare(),返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同. 1 a.nickName.localeCompare(b.nickName, 'zh-Hans-CN', {sensitivity: 'accent'}) 在react-native环境

js对汉字首字母排序

var city = ["北京","天津","上海","重庆","杭州"];city.sort(function compareFunction(a,b){ return a.localeCompare(b); }); console.log(city); ==>["北京", "重庆", "杭州", "上海", "

SQL根据汉字首字母排序

order by Name collate Chinese_PRC_CS_AS_KS_WS asc 原文地址:https://www.cnblogs.com/cheua/p/10722638.html

在iOS中获取UIView的所有层级结构 相关

在iOS中获取UIView的所有层级结构 应用场景 在实际 iOS 开发中,很多时候都需要知道某个 UI 控件中包含哪些子控件,并且分清楚它们的层级结构和自个的 frame 以及 bounds ,以便我们完成复杂的 UI 布局,下面的代码就能很方便的获取某个 UI 控件的所有的层级结构,我们可以用它计算,然后把结果写入到本地磁盘,导出成XML文件,这样我们就可以很直观的看出它内部的细节. /** * 返回传入veiw的所有层级结构 * * @param view 需要获取层级结构的view *

IOS中获取各个文件的目录路径的方法和NSFileManager类

转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有

IOS中获取各种文件的目录路径的方法

iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,

C# 从众多网卡中获取本地物理网卡的ip

1 /// <summary> 2 /// 获取本机物理网卡的ip 3 /// </summary> 4 /// <returns></returns> 5 public static string IPAddress() 6 { 7 string userIP = ""; 8 System.Net.NetworkInformation.NetworkInterface[] fNetworkInterfaces = System.Net.

ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值

本文原创,转载请注明原创地址 http://blog.csdn.net/dongyu1009/article/details/37697389 用AGSImageServiceIdentifyTask可以获取ArcGISImageServiceLayer图层中的栅格值.这涉及了三个比较重要的类:AGSImageServiceIdentifyParameters.AGSImageServiceIdentifyTask和AGSImageServiceIdentifyResult,还有一个delega

向Android模拟器中批量导入通讯录联系人

使用adb命令向Android模拟器中批量导入通讯录联系人的方法: 使用adb提供的命令, 可以非常方便地从PC中将通讯录批量导入android模拟器中. 首先要先准备好固定格式的vcf文件, 该文件即android中的通讯录存储格式文件. 格式如下: BEGIN:VCARD VERSION:2.1 N:;Qiqi;;; FN:Qiqi TEL;HOME:7474 EMAIL;HOME:qiqi.com ADR;HOME:;;Qiqi;;;; END:VCARD BEGIN:VCARD VERS