#pragma mark - 通讯录排序
- (void)addressBookOrdering:(NSArray *)array{[self.sectionTitleArray removeAllObjects];[self.dataSource removeAllObjects];//赋初值 A~Z # for (int i = 65; i < 91; i ++) {char c = (char)i;NSMutableArray *array = [NSMutableArray array];NSString *key = [NSString stringWithFormat:@"%c",c];[self.dataSource setObject:array forKey:key];}[self.dataSource setObject:[NSMutableArray array] forKey:@"#"];//遍历联系人信息for (CNContact *cnContact in array) {//备注名 NSString *name = [NSString stringWithFormat:@"%@%@",cnContact.familyName,cnContact.givenName];//判断是否有备注名if (name.length == 0) {CNLabeledValue *lableValue = cnContact.phoneNumbers[0];name = lableValue.label;}if (name.length == 0) {NSArray *arrayWithPhone = cnContact.phoneNumbers;CNLabeledValue *labelValue = arrayWithPhone[0];CNPhoneNumber *phoneNumber = labelValue.value;name = phoneNumber.stringValue;}//获取备注名首字母NSString *key = [self firstCharactorWithString:name];NSMutableArray *ar = self.dataSource[key];//保存备注名NSMutableDictionary *dic = [@{@"name":name} mutableCopy];NSMutableArray *phones = [NSMutableArray array];NSArray *arrayWithPhone = cnContact.phoneNumbers;for (CNLabeledValue *labelValue in arrayWithPhone) {CNPhoneNumber *phoneNumber = labelValue.value;[phones addObject:phoneNumber.stringValue];}//保存电话[dic setObject:phones forKey:@"phones"];NSData *data = cnContact.thumbnailImageData;UIImage *image = [UIImage imageWithData:data];//保存头像if (image == nil) {[dic setObject:@"" forKey:@"header"];} else{[dic setObject:image forKey:@"header"];}[ar addObject:dic];//保存联系人信息[self.dataSource setObject:ar forKey:key];}//删除多余的分类for (NSString *key in self.dataSource.allKeys) {NSArray *array = self.dataSource[key];if (array.count == 0) {[self.dataSource removeObjectForKey:key];}}self.closeButton.hidden = YES;[self.tableV reloadData];
}#pragma mark - 通讯录搜索
- (void)searchPhone{[self.arrayWithSearch removeAllObjects];//搜索关键字(可以是数字、文字)NSString *searchText = self.searchTextField.text;if (searchText.length == 0) {[self addressBookOrdering:self.arrayWithTableV];self.closeButton.hidden = NO;[self.tableV layoutIfNeeded];[self.tableV setContentOffset:self.oldPoint animated:NO];return;}//遍历获取搜索数据for (CNContact *cnContact in self.arrayWithTableV) {NSString *name = [NSString stringWithFormat:@"%@%@",cnContact.familyName,cnContact.givenName];if (!([name rangeOfString:searchText].location == NSNotFound) ) {[self.arrayWithSearch addObject:cnContact];continue;}NSArray *arrayWithPhone = cnContact.phoneNumbers;for (int i = 0; i < arrayWithPhone.count; i ++) {CNLabeledValue *labelValue = arrayWithPhone[i];CNPhoneNumber *phoneNumber = labelValue.value;name = labelValue.label;if (!([name rangeOfString:searchText].location == NSNotFound) ) {[self.arrayWithSearch addObject:cnContact];break;}name = [self dealWithPhone:phoneNumber.stringValue];if (!([name rangeOfString:searchText].location == NSNotFound) ) {[self.arrayWithSearch addObject:cnContact];break;}}}//对搜索数据进行排序展示[self addressBookOrdering:self.arrayWithSearch];//因为使用同一个tableView所以滑动到顶部[self.tableV layoutIfNeeded];[self.tableV setContentOffset:CGPointMake(0, 0) animated:NO];
}/** 处理手机号 */
- (NSString *)dealWithPhone:(NSString *)phone{NSString *phoneNum = [NSString stringWithFormat:@"%@",phone];phoneNum = [phoneNum stringByReplacingOccurrencesOfString:@" " withString:@""];phoneNum = [phoneNum stringByReplacingOccurrencesOfString:@"-" withString:@""];phoneNum = [phoneNum stringByReplacingOccurrencesOfString:@"+86" withString:@""];phoneNum = [phoneNum stringByReplacingOccurrencesOfString:@"," withString:@""];return phoneNum;
}//获取某个字符串或者汉字的首字母.
- (NSString *)firstCharactorWithString:(NSString *)string
{NSMutableString *str = [NSMutableString stringWithString:string];CFStringTransform((CFMutableStringRef) str, NULL, kCFStringTransformMandarinLatin, NO);CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformStripDiacritics, NO);NSString *pinYin = [str capitalizedString];if (pinYin.length == 0) {return @"#";}unichar c = [pinYin characterAtIndex:0];if (c <'A'|| c >'Z'){return @"#";}NSCharacterSet *notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];if ([[pinYin substringToIndex:1] rangeOfCharacterFromSet:notDigits].location == NSNotFound){// 是数字return @"#";}if ([[pinYin substringToIndex:1] isEqual:@"_"]) {return @"#";}return [pinYin substringToIndex:1];
}

详情 https://www.jianshu.com/p/c827e6698873

iOS 通讯录开发(排序、搜索、头像处理)—— 之前写在简书相关推荐

  1. Android通讯录模糊匹配搜索实现(号码 首字母 简拼 全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  2. php实现通讯录按字母分组,iOS - 通讯录开发,名字按拼音首字母分组排序

    应项目需要,需添加一个自定义的通讯录,所以需要对联系人按名字的首字母进行排序.以下方法已经封装好,复制到项目中直接可以使用. 该方法是使用UILocalizedIndexedCollation来进行本 ...

  3. 通讯录c语言编程按字母分组,iOS - 通讯录开发,名字按拼音首字母分组排序

    应项目需要,需添加一个自定义的通讯录,所以需要对联系人按名字的首字母进行排序.以下方法已经封装好,复制到项目中直接可以使用. 该方法是使用UILocalizedIndexedCollation来进行本 ...

  4. 《iOS 8开发指南(第2版)》——第1章,第1.3节工欲善其事,必先利其器——搭建开发环境...

    本节书摘来自异步社区<iOS 8开发指南(第2版)>一书中的第1章,第1.1节1.3 工欲善其事,必先利其器--搭建开发环境,作者 管蕾,更多章节内容可以访问云栖社区"异步社区& ...

  5. 给简书找BUG赢好礼17.11.27——简书iOS 4.2.0 公测(全新简友圈、发现页;连载内容横空出世)...

    这一次,我们很不一般!简书iOS最新版4.2.0公测!现在召集首批体验的用户,您的意见将会非常地宝贵和重要! 为表达谢意,凡参与简书公测,就有机会获得简书提供的精美周边! 点击下载4.2.0>& ...

  6. android 添加通讯录联系人头像,Android 手机通讯录开发时给联系人添加头像失败的坑...

    Android 手机通讯录开发时给联系人添加头像失败的坑,在给联系人添加头像代码 Bitmap photo = ...; // 将 Bitmap 转为 byte[] byte[] bytes = Ls ...

  7. (字母排序搜索)类似微信通讯录效果

    最近刚好有要做一个聊天通讯录,有点类似微信,所以自己也把探索的总结一下,可能还要进一步优化: 不多说,先上效果图看看: 这里先说一些,要使用拼音字母转换,我们引用了第三方拼音库(pinyin4j-2. ...

  8. iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted

    iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted 之前介绍了怎么操作越狱的iOS设备(以下简称为手机),但简单操作手机并不是目标,小程的目标是手机上特 ...

  9. PPGetAddressBook获取系统通讯录并排序

    最近在做读取系统通讯录并排序,发现了一个第三方库不错.PPGetAddressBook读取4000个联系人时间大概2秒左右.优点: 1  拼音转换时间对比了PinYin4Objc更快些. 2 处理了几 ...

最新文章

  1. Hadoop HA+Federation 高可用联邦模式搭建指南
  2. 阿呆做网站(3)--建数据库
  3. 解决Eclipse、Android Studio ADT AVD不能检测到手机
  4. spring mvc绑定对象String转Date解决入参不能是Date的问题
  5. 学习《css世界》笔记之多行文本实现垂直居中
  6. android 广告栏效果,实现android广告栏效果
  7. Android 中流量、电量、弱网环境怎么测?
  8. update mysql.user set password_使用update命令来修改Mysql的root密码
  9. Spring里用到了哪些设计模式
  10. iOS 三步完成购买苹果开发者账号
  11. 油猴(Tampermonkey)安装教程
  12. 在谷歌云盘训练YOLOV5模型
  13. Altium Designer,打开PCB文件,提示:File type not recognised
  14. 浅墨博客《游戏编程模式》
  15. 【python】调用百度智能云API实现手写文字识别
  16. Gossiping闲聊路由协议
  17. “肆拾玖坊号”高铁冠名列车今日正式首发
  18. 微信小程序和uniapp开发工具
  19. 彩色花砖机技术参数列表厂家分享
  20. 请广大编程爱好者加入QQ群5907439

热门文章

  1. ppt矩形里面的图片怎么放大缩小_这样的九宫格缩放效果,是怎么用PPT做出来的呢?...
  2. AutoWire(自动装配)
  3. 安装pandas和sklearn
  4. idea汉化教程-其他软件同样操作
  5. OPPO手机ColorOS_V7版本的开发者选项如何打开
  6. 设置word默认字体大小
  7. Diagram Designer流程图制作工具下载安装及使用
  8. IGS2.0速文信息安全管理系统常见售前问题解答
  9. 君の古风操作系统Haiku现已支持Node.js
  10. 浅谈A/B测试 ,看这一篇就足够了