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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值