在ios9的时候AddressBook.framework和AddressBookUI.framework全部过时,苹果新推Contacts.framework和ContactsUI.framework,这两个框架用起来就比较简单了。
下面先简单的介绍下用法。我们先去创建一个通讯录界面也就是系统自带的UI界面
//创建通讯录界面
CNContactPickerViewController * picker = [CNContactPickerViewController new];
//设置代理,代理对象需要去遵守CNContactPickerDelegate这个协议
picker.delegate = self;
//弹出模态视图
[self presentViewController:picker animated:YES completion:nil];
有5个代理方法是我们需要了解的如下所示
#pragma mark 点击取消的时候会调用下面的方法
-(void)contactPickerDidCancel:(CNContactPickerViewController *)picker
{
NSLog(@"cancel");
}
#pragma mark 会进入多选模式,当我们选中了多个联系人没有选中的时候再去点击完成会调用
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact *> *)contacts
{
NSLog(@"%@",contacts);
}
进入多选联系人的界面如下所示
#pragma mark 选中某个联系人的时候会去调用,点击某个联系人之后会退出
这里我们需要通过联系人中取phoneNumbers也就是电话号码,我们之所以下面会用CNLabeldValue和CNPhoneNumber是因为帮助显示如下图所示,
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
{
//1、获取姓名
NSLog(@"givenName: %@ familyName: %@",contact.givenName,contact.familyName);
for (CNLabeledValue *labelValue in contact.phoneNumbers)
{
//获取的是什么电话比如说有家庭电话,工作电话之类的
NSString * str = labelValue.label;
NSLog(@"%@",str);
//获取电话号码
CNPhoneNumber * number = labelValue.value;
NSLog(@"phoneNumber: %@",number.stringValue);
}
}
#pragma mark 点击某个属性的时候会去调用下面的代理方法
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty
{
NSLog(@"%@",contactProperty);
}
#pragma mark 进入多选模式,点击done会调用下面的代理方法
需要注意的是,如果我们这里不去设置通讯录控制器的这个predicateForSelectionOfProperty属性,我们仅仅实现下面这个方法的话,在多选模式下不管选没选中联系人,点击Done完成按钮的时候下面的contactProperties都是为null。如何去设置了predicateForSelectionOfProperty,比如说设置了,那么只有满足下面这个正则表达式条件的联系人可以被选中,其他联系人无法选中,选中之后点击完成,也是直接就dismiss了。
predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key == 'emailAddresses') AND (value LIKE '*@mac.com')"];
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty *> *)contactP
roperties
{
NSLog(@"%@",contactProperties);
}
一般来说上面这五个代理方法中我们除了取消的那个代理方法,其他四个代理方法我们选择一个实现其实就可以了。