#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];
}