在iOS程序用调用程序通讯录,并获得相关信息
- 要实现该功能, 必须要导入两个系统框架, 分别是
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
- 之后,通过适当的事件来在程序中弹出通讯录,比如为UIButton添加一个点击事件来弹出通讯录
- (IBAction)btnClick:(id)sender
{
ABPeoplePickerNavigationController *peoleVC = [[ABPeoplePickerNavigationControlleralloc] init];
peoleVC.peoplePickerDelegate = self;
[self presentModalViewController:peoleVC animated:YES];
//特别注意,这里要使用膜态弹出。
[peoleVC release];
}
这个时候, 已经可以顺利的弹出通讯录,但是当我们点击右上角的cancel按钮,已经点击联系人的电话的时候,程序不能正确响应我们的操作,我们还需要实现代理(@protocol ABPeoplePickerNavigationControllerDelegate <NSObject>)方法来完成功能。
- 通过相应的代理方法取得通讯录中的数据。主要代理方法如下:
-
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
NSLog(@"peoplePickerNavigationControllerDidCancel");
[selfdismissModalViewControllerAnimated:YES];
}
该方法在用户点击弹出通讯录右上角的cancel按钮的时候调用,我们可以在这个方法里实现我们退出通讯录的操作:[selfdismissModalViewControllerAnimated:YES];
-
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
return YES;
}
当用户通过一个时间进入对话框的时候,显示出来的是一个联系人界面,列出了所有联系人的名字。这个方法就是确定用户是否可以通过点击联系人,查看某个联系人的详情。如果返回 NO,则无法查看列表中联系人的详情,默认返回值为 YES。
-
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
//取联系人姓名
NSString *name = (NSString *)ABRecordCopyCompositeName(person);
NSLog(@"=======>%@",name);
//判断点击的区域
if (property == kABPersonPhoneProperty)
{
//取出当前点击的区域中所有的内容
ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person,kABPersonPhoneProperty);
//根据点击的那一行对应的identifier取出所在的索引
int index = ABMultiValueGetIndexForIdentifier(phoneMulti, identifier);
//根据索引把相应的值取出
NSString *phone = (NSString *)ABMultiValueCopyValueAtIndex(phoneMulti, index);
NSLog(@"%@",phone);
}
[self dismissModalViewControllerAnimated:YES];
return NO;
}
该代理方法响应用户进入联系人详情页面后的相关操作,比如去的联系人的某个电话号码。返回值用来表示是否响应系统默认的点击操作,例如,当返回值为yes的之后,我们点击用户的电话号码,除了进行我们规定的取值操作意外,还会执行系统默认的拨号操作,我们当然,如果点击网址,就会打开浏览器,进入点击的页面。 因此,我们将返回值设置为NO。