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

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

/*** 加载本地联系人*/
- (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的代理方法也贴一下:

- (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。

 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得类别方法

- (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)

相关推荐

  • IOS 通讯录的访问和修改的实现

    IOS 通讯录的访问和修改的实现 在iOS端可以通过AddressBook或者AddressBookUI两个框架实现,区别是第二个框架带视图,一般使用第一个框架就够了. 下面介绍AddressBook框架的使用,注意这个是C语言框架,使用起来比较麻烦. ①请求授权 先判断授权状态,如果未授权则进行授权. // 1.主动请求授权,先判断授权状态 NSInteger state = ABAddressBookGetAuthorizationStatus(); if (state == kABAuth

  • iOS实现封装一个获取通讯录的工具类详解

    前言 本文给大家介绍了关于iOS如何封装一个获取通讯录工具类的相关内容,iOS获取通讯录一共有4个framework: AddressBook, AddressBookUI, Contacts, ContactsUI; 其中 AddressBook 和 AddressBookUI 已经被iOS9时 deprecated 了, 而推出了Contacts 和 ContactsUI 取代之. 其中 AddressBookUI 和 ContactsUI 是picker出一个界面提供选择一条联系人信息并且

  • iOS获取手机通讯录方式方法(最新)

    最近学习了iOS获取手机通讯录方式方法,现在分享给大家.希望此文章对各位有所帮助. 一.iOS 9 以前的通讯录框架 AddressBookUI框架:提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人. AddressBook 框架:纯 C 语言的 API,仅仅是获得联系人数据.没有提供 UI 界面展示,需要自己搭建联系人展示界面. 二. iOS 9 以后最新通讯录框架 ContactsUI 框架:拥有 AddressBookUI 框架的所有功能,使用起来更加的面向对象.

  • 详解iOS获取通讯录的4种方式

    本文实例为大家分享了iOS获取通讯录的4种方式,供大家参考,具体内容如下 使用场景 一些App通过手机号码来推荐好友,如 微博.支付宝 首先客户端会获取通讯录中的所有手机号然后将这些手机号提交到App服务器中,服务器会查找每个手机号对应的App账号如QQ号码返回到客户端,然后客户端根据服务器返回的账号列表来推荐好友. 获取联系人方式 方案一:AddressBookUI.framework框架 提供了联系人列表界面.联系人详情界面.添加联系人界面等 一般用于选择联系人 方案二:AddressBoo

  • iOS开发中使app获取本机通讯录的实现代码实例

    一.在工程中添加AddressBook.framework和AddressBookUI.framework 二.获取通讯录 1.在infterface中定义数组并在init方法中初始化 复制代码 代码如下: NSMutableArray *addressBookTemp;   - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     addressBookTemp = [NSMut

  • 如何自定义iOS通讯录

    苹果给用户提供了自己的通讯录,但是根据业务的需求,需要自定义通讯录,我们就需要根据业务需求来自定义. 首先我们需要知道苹果的提供的一些Foundation.UIKit框架,了解其中的一些特性,可以打开手机查看苹果系统提供的原生的通讯录,可以看到: 1.搜索框 2.右侧搜索条 3.联系人分组 4.添加联系人 5.获取联系人头像及联系方式 根据需求,可以总结出自定义通讯录需要做的一些功能,一项大的功能可以差分成一些小的功能,然后一个一个实现,将复杂的问题差分成小问题解决. 1.自定义搜索框 2.获取

  • IOS 通讯录信息读取兼容的实现方法

    IOS 通讯录信息读取兼容的实现方法 项目中有一个功能需要读取通讯录中联系人的手机.在iOS8以前都是可用的,主要使用如下三个代理方法来实现 - (void) peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker - (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController

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

    iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBooks = nil; if (DeviceVersion < 6.0) { addressBooks = ABAddressBookCreate(); } else { addressBooks = ABAddressBookCreateWithOptions(NULL, NULL); //获取通讯

  • mysql如何根据汉字首字母排序

    复制代码 代码如下: select areaName from area order by convert(areaName USING gbk) COLLATE gbk_chinese_ci asc 说明:areaName为列名 area为表名 PS:这里再为大家推荐一款本站的相关在线工具供大家参考: 在线中英文根据首字母排序工具: http://tools.jb51.net/aideddesign/zh_paixu

  • iOS中获取系统相册中的图片实例

    本文介绍了iOS中获取系统相册中的图片,在很多应用中都能用到,可以获取单张图片,也可以同时获取多张图片,废话不多说了,看下面吧. 一.获取单张图片 思路: 1.利用UIImagePickerController可以从系统自带的App(照片\相机)中获得图片 2.设置代理,遵守代理协议 注意这个UIImagePickerController类比较特殊,需要遵守两个代理协议 @interface ViewController () <UIImagePickerControllerDelegate,

  • 利用PHP获取汉字首字母并且分组排序详解

    前言 本文主要给大家介绍了关于PHP获取汉字首字母并分组排序的相关内容,因经常我们在做项目的时候,会有按首字母排序的需求 比如: 美团的城市选择 http://www.meituan.com/index/changecity/initiative app中按字母搜索 正题 网上找了各种,不尽人意,于是,自己就写了一个,分享给大家. <?php /** * @author Tech */ class Character { /** * 二维数组根据首字母分组排序 * @param array $d

  • JS实现获取汉字首字母拼音、全拼音及混拼音的方法

    本文实例讲述了JS实现获取汉字首字母拼音.全拼音及混拼音的方法.分享给大家供大家参考,具体如下: 这里需要用到一个js获取汉字拼音的插件,可点击此处本站下载. 运行效果如下: 完整示例代码: <!DOCTYPE HTML> <html> <head> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script type=

  • PHP常用函数之获取汉字首字母功能示例

    本文实例讲述了PHP常用函数之获取汉字首字母功能.分享给大家供大家参考,具体如下: //获取汉字的首字母 function getFirstCharters($str) { if (empty($str)) { return ''; } //取出参数字符串中的首个字符 $temp_str = substr($str,0,1); if(ord($temp_str) > 127){ $str = substr($str,0,3); }else{ $str = $temp_str; $fchar =

  • PHP自定义函数获取汉字首字母的方法

    本文实例讲述了PHP自定义函数获取汉字首字母的方法.分享给大家供大家参考,具体如下: 首字母很重要,可以进行排序使用. 城市列表等等. <?php /* * Created on 2016-12-1 */ function getFirstCharter($str) { if (empty($str)) { return ''; } $fchar = ord($str{0}); if ($fchar >= ord('A') && $fchar <= ord('z')) r

  • ASP自动获取汉字首字母函数(支持UTF-8/GB2312)

    asp 取得中文句子头一个字的大写拼音字母的函数 UTF-8编码函数 utf-8编码应该是当前使用最多的编码方式了. 'UTF-8获取汉字首字母 function GetPy4utf(char) if char=null or len(trim(char))=0 then exit function dim strCHSfirstPY strCHSfirstPY ="YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPF

  • Java编程实现中英混合字符串数组按首字母排序的方法

    本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法.分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序.例如: String[] arrays = new String[] { "gyu", "sdf", "zf", "大同", "收到", "地方", "三等分"

  • php获取汉字首字母的函数

    网上的方法有不少,都是一样的原理,按照需求,做了一下版本的class类文件,主要功能是:功能明确,易于修改维护和扩展: 英文的字串:不变返回(包括数字):中文字符串:返回拼音首字符: 中英混合串: 返回拼音首字符和英文.该算法采用了二分法查找,修复了之前字母Z读取成Y的错误.好东西要收藏,故在此留下印记,以供后人考证! 复制代码 代码如下: <?php  /*** Modified by http://iulog.com @ 2013-05-07* 修复二分法查找方法* 汉字拼音首字母工具类* 

随机推荐