iOS 通讯录开发(排序、搜索、头像处理)—— 之前写在简书
#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 通讯录开发(排序、搜索、头像处理)—— 之前写在简书相关推荐
- Android通讯录模糊匹配搜索实现(号码 首字母 简拼 全拼)
Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...
- php实现通讯录按字母分组,iOS - 通讯录开发,名字按拼音首字母分组排序
应项目需要,需添加一个自定义的通讯录,所以需要对联系人按名字的首字母进行排序.以下方法已经封装好,复制到项目中直接可以使用. 该方法是使用UILocalizedIndexedCollation来进行本 ...
- 通讯录c语言编程按字母分组,iOS - 通讯录开发,名字按拼音首字母分组排序
应项目需要,需添加一个自定义的通讯录,所以需要对联系人按名字的首字母进行排序.以下方法已经封装好,复制到项目中直接可以使用. 该方法是使用UILocalizedIndexedCollation来进行本 ...
- 《iOS 8开发指南(第2版)》——第1章,第1.3节工欲善其事,必先利其器——搭建开发环境...
本节书摘来自异步社区<iOS 8开发指南(第2版)>一书中的第1章,第1.1节1.3 工欲善其事,必先利其器--搭建开发环境,作者 管蕾,更多章节内容可以访问云栖社区"异步社区& ...
- 给简书找BUG赢好礼17.11.27——简书iOS 4.2.0 公测(全新简友圈、发现页;连载内容横空出世)...
这一次,我们很不一般!简书iOS最新版4.2.0公测!现在召集首批体验的用户,您的意见将会非常地宝贵和重要! 为表达谢意,凡参与简书公测,就有机会获得简书提供的精美周边! 点击下载4.2.0>& ...
- android 添加通讯录联系人头像,Android 手机通讯录开发时给联系人添加头像失败的坑...
Android 手机通讯录开发时给联系人添加头像失败的坑,在给联系人添加头像代码 Bitmap photo = ...; // 将 Bitmap 转为 byte[] byte[] bytes = Ls ...
- (字母排序搜索)类似微信通讯录效果
最近刚好有要做一个聊天通讯录,有点类似微信,所以自己也把探索的总结一下,可能还要进一步优化: 不多说,先上效果图看看: 这里先说一些,要使用拼音字母转换,我们引用了第三方拼音库(pinyin4j-2. ...
- iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted
iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted 之前介绍了怎么操作越狱的iOS设备(以下简称为手机),但简单操作手机并不是目标,小程的目标是手机上特 ...
- PPGetAddressBook获取系统通讯录并排序
最近在做读取系统通讯录并排序,发现了一个第三方库不错.PPGetAddressBook读取4000个联系人时间大概2秒左右.优点: 1 拼音转换时间对比了PinYin4Objc更快些. 2 处理了几 ...
最新文章
- Hadoop HA+Federation 高可用联邦模式搭建指南
- 阿呆做网站(3)--建数据库
- 解决Eclipse、Android Studio ADT AVD不能检测到手机
- spring mvc绑定对象String转Date解决入参不能是Date的问题
- 学习《css世界》笔记之多行文本实现垂直居中
- android 广告栏效果,实现android广告栏效果
- Android 中流量、电量、弱网环境怎么测?
- update mysql.user set password_使用update命令来修改Mysql的root密码
- Spring里用到了哪些设计模式
- iOS 三步完成购买苹果开发者账号
- 油猴(Tampermonkey)安装教程
- 在谷歌云盘训练YOLOV5模型
- Altium Designer,打开PCB文件,提示:File type not recognised
- 浅墨博客《游戏编程模式》
- 【python】调用百度智能云API实现手写文字识别
- Gossiping闲聊路由协议
- “肆拾玖坊号”高铁冠名列车今日正式首发
- 微信小程序和uniapp开发工具
- 彩色花砖机技术参数列表厂家分享
- 请广大编程爱好者加入QQ群5907439