美文网首页iOS技术难点iOS开发技巧iOS
ios9.0 ContactsUI获取通讯录联系人信息

ios9.0 ContactsUI获取通讯录联系人信息

作者: 木头Lee | 来源:发表于2016-07-10 10:22 被阅读1427次

    第1步:准备工作

    • 导入头文件 #import <ContactsUI/ContactsUI.h>
    • 遵守协议 <CNContactPickerDelegate>

    第2步: 显示选择联系人控制器

    //获取通讯录方法
    - (void) getContactInfo
    {
        //创建选择联系人的导航控制器
        peoplePickVC = [[CNContactPickerViewController alloc] init];
      
        //设置代理
        peoplePickVC.delegate = self;
        
        //弹出联系人界面
        [self showViewController:peoplePickVC sender:nil];
    }
    

    注意:如果Xcode提示:plugin com.apple.MobileAddressBook.ContactsViewService invalidated,只要把CNContactPickerViewController设置为全局变量即可:`

    static CNContactPickerViewController * peoplePickVC;
    

    第3步:实现代理方法

    • 如果同时实现了选中多个和单个联系人的代理方法,那么即便选单个联系人,也是会走选中多个联系人的代理方法(只不过数组只保留一个联系人),单人选中方法被忽略
    • 单个联系人选中方法和选中联系人号码属性方法不可以同时实现,因为既然选中了单个联系人,就没办法进入联系人详情界面再去选中号码属性了

    代理方法1:选中单个联系人时调用这个方法

    getSingleContact.gif
    -(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
    {
        //获取联系人姓名
        NSString * firstName = contact.familyName;
        NSString * lastName = contact.givenName;
        NSLog(@"姓名:%@ %@",firstName,lastName);
        
        
        //数组保存各种类型的联系方式的字典(可以理解为字典) 字典的key和value分别对应号码类型和号码
        NSArray * phoneNums = contact.phoneNumbers;
        
        //通过遍历获取联系人各种类型的联系方式
        for (CNLabeledValue *labelValue in phoneNums)
        {
            //取出每一个字典,根据键值对取出号码和号码对应的类型
            NSString *phoneValue = [labelValue.value stringValue];
            NSString *phoneLabel = labelValue.label;
            NSLog(@"%@:%@",phoneLabel,phoneValue);
        }
    }
    
    

    代理方法2:选中联系人的单个号码类型时调用这个方法

    getSingleContactProperty.gif
    -(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty
    {
        //获取联系人信息
        NSString * firstName = contactProperty.contact.familyName;  //姓
        NSString * lastName = contactProperty.contact.givenName;    //名
        
        NSString * phoneNum = [contactProperty.value stringValue];  //号码
        NSString * phoneLabel = contactProperty.label;                //号码类型
        
        NSLog(@"姓名:%@ %@ \n %@:%@",firstName,lastName, phoneLabel, phoneNum);
    }
    

    代理方法3:选中多个联系人时调用这个方法

    getMultiContact.gif
    -(void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact *> *)contacts
    {
        //遍历选中联系人数组,获取联系人姓名和电话
        for (CNContact * contact in contacts)
        {
            //获取联系人姓名
            NSString * firstName = contact.familyName;
            NSString * lastName = contact.givenName;
            NSLog(@"姓名:%@ %@",firstName,lastName);
            
            
            //数组保存各种类型的联系方式的字典(可以理解为字典) 字典的key和value分别对应号码类型和号码
            NSArray * phoneNums = contact.phoneNumbers;
            
            //通过遍历获取联系人各种类型的联系方式
            for (CNLabeledValue *labelValue in phoneNums)
            {
                //取出每一个字典,根据键值对取出号码和号码对应的类型
                NSString *phoneValue = [labelValue.value stringValue];
                NSString *phoneLabel = labelValue.label;
                NSLog(@"%@:%@",phoneLabel,phoneValue);
            }
        }
    }
    

    代理方法4:选中联系人的多个号码类型时调用这个方法

    -(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty *> *)contactProperties
    {
        //取出第一个属性,获取联系人姓名
        CNContactProperty * contactProperty = contactProperties.firstObject;
        NSString * firstName = contactProperty.contact.familyName;  //姓
        NSString * lastName = contactProperty.contact.givenName;    //名
        NSLog(@"姓名:%@ %@ ",firstName,lastName);
        
        //遍历选中多个类型号码数组的详细信息
        for (CNContactProperty * contactProperty in contactProperties)
        {
            NSString * phoneNum = [contactProperty.value stringValue];    //号码
            NSString * phoneLabel = contactProperty.label;                //号码类型
            
            NSLog(@"%@:%@",phoneLabel, phoneNum);
        }
    }
    

    注意:只实现该方法会停留在选择多个联系人界面,要对控制器的predicateForSelectionOfProperty属性设置要筛选的条件,只有满足筛选条件的联系人才可以被选中。这个怎么设置我实在编不下去了😜😜😜,好像是正则表达式的内容,也没找到相关资料,希望有大神看到不吝赐教!

    peoplePickVC.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key == 'emailAddresses') AND (value LIKE '*@mac.com')"];
    

    代理方法5:点击取消选择联系人(或联系人属性时调用这个方法)

    cancelSelect.gif
    -(void)contactPickerDidCancel:(CNContactPickerViewController *)picker
    {
        NSLog(@"取消选择联系人!");
    }
    

    相关文章

      网友评论

      • 不会游泳的飞鱼:怎么获取联系人
        创建时间啊
      • 嘿晴天:为啥单选的时候,点击号码无法进入详情页面
      • 洁简:第一次进入联系人会卡一会为何呢
      • 无聊的暧:筛选电话号码 peoplePickVC.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key == 'phoneNumbers')"];
      • 简单也好:有用 :smile:

      本文标题:ios9.0 ContactsUI获取通讯录联系人信息

      本文链接:https://www.haomeiwen.com/subject/iaqdjttx.html