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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include #include using namespace std; #define NULL 0 unsigned int key; //用来输入/输出文件流类 unsigned int key2; //key和key2分别是用做了电话号码和姓名的关键字 int *p; struct node //新建节点(用户姓名、地址、电话号码、指向下一个结点的指针 ) { char name[8],address[20]; char num[11]; node * next; }; typedef node* pnode; typedef node* mingzi; //声明了名字和电话两个指针 node **phone; node **nam; node *a; void hash(char num[11]) //以电话号码为关键字建立哈希函数 { int i = 3; key=(int)num[2]; while(num[i]!=NULL) { key+=(int)num[i]; i++; } key=key%20; } void hash2(char name[8]) //姓名为关键字建立哈希函数 { int i = 1; key2=(int)name[0]; while(name[i]!=NULL) { key2+=(int)name[i]; i++; } key2=key2%20; } //强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除以20后的余数 node* input() //输入节点信息 ,建立结点,并将结点的next指针指空 { node *temp; temp = new node; temp->next=NULL; cout<<"输入姓名:"<>temp->name; cout<<"输入地址:"<>temp->address; cout<<"输入电话:"<>temp->num; return temp; } //对于指针类型返回的是地址 int apend() //添加节点 { node *newphone; node *newname; newphone=input(); newname=newphone; newphone->next=NULL; newname->next=NULL; hash(newphone->num); //利用哈希函数计算出对应关键字的存储地址 hash2(newname->name); newphone->next = phone[key]->next; //利用电话号码为关键字插入 phone[key]->next=newphone; //是采用链地址法,拉链法处理冲突的散列表结构 newname->next = nam[key2]->next; //利用用户名为关键字插入 nam[key2]->next=newname; return 0; } void create() //新建节点 { int i; phone=new pnode[20]; //动态创建对象数组,C++课本P188页 for(i=0;inext=NULL; } } void create2() //新建节点 { int i; nam=new mingzi[20]; for(i=0;inext=NULL; } } void list() //显示列表 { int i; node *p; for(i=0;inext; while(p) { cout<name<<'_'<address<<'_'<num<next; } } } void list2() //显示列表 { int i; node *p; for(i=0;inext; while(p) { cout<name<<'_'<address<<'_'<num<next; } } } void find(char num[11]) //在以电话号码为关键字的哈希表中查找用户信息 { hash(num); node *q=phone[key]->next; while(q!= NULL) { if(strcmp(num,q->num)==0) break; q=q->next; } if(q) cout<name<<"_" <address<<"_"<num<<endl; else cout<<"无此记录"<next; while(q!= NULL) { if(strcmp(name,q->name)==0) break; q=q->next; } if(q) cout<name<<"_" <address<<"_"<num<<endl; else cout<<"无此记录"<<endl; } void save() //保存用户信息 { int i; node *p; for(i=0;inext; while(p) { fstream iiout("out.txt", ios::out); //创建一个文件流对象:iiout iiout<name<<"_"<address<<"_"<num<next; } } } void menu() //菜单 { cout<<" 哈希表通讯录"<<endl; cout<<" 0.添加记录"<<endl; cout<<" 2.姓名散列"<<endl; cout<<" 3.查找记录"<<endl; cout<<" 4.号码散列"<<endl; cout<<" 5.清空记录"<<endl; cout<<" 6.保存记录"<<endl; cout<<" 7.退出系统"<>sel; if(sel==3) { cout<<"8姓名查询" <<endl;cout<<"9号码查询"<>b; if(b==9) {cout<<"请输入电话号码:"<>num; cout<<"输出查找的信息:"<<endl; find(num); } else {cout<<"请输入姓名:"<>name; cout<<"输出查找的信息:"<<endl; find2(name);}} if(sel==2) {cout<<"姓名散列结果:"<<endl; list2();} if(sel==0) {cout<<"请输入要添加的内容:"<<endl; apend();} if(sel==4) {cout<<"号码散列结果:"<<endl; list(); } if(sel==5) {cout<<"列表已清空:"<<endl; create();create2();} if(sel==6) { cout<<"通信录已保存:"<<endl; save();} if(sel==7) return 0; } return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值