1 #import "ViewController.h" 2 #import <AddressBookUI/AddressBookUI.h> 3 4 @interface ViewController () <ABPeoplePickerNavigationControllerDelegate> 5 @property (weak, nonatomic) IBOutlet UILabel *nameLabel; 6 @property (weak, nonatomic) IBOutlet UILabel *phoneNumLabel; 7 8 @end 9 10 @implementation ViewController 11 12 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 13 { 14 // 创建联系人选择控制器 15 ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init]; 16 17 // 设置代理 18 ppnc.peoplePickerDelegate = self; 19 20 // 显示控制器 21 [self presentViewController:ppnc animated:YES completion:nil]; 22 23 } 24 25 #pragma mark - ABPeoplePickerNavigationControllerDelegate(iOS8) 26 /** 27 * 选中联系人的时候会调用 28 * 29 * @param person 被选中的联系人 30 */ 31 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person 32 { 33 [self getNameWithPerson:person]; 34 [self getPhoneNumberWithPerson:person]; 35 } 36 37 /** 38 * 选中联系人的某个属性的时候调用 39 * 40 * @param person 被选中的联系人 41 * @param property 属性 42 * @param identifier 属性对应的标识 43 */ 44 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 45 { 46 NSLog(@"%s", __func__); 47 } 48 49 #pragma mark - ABPeoplePickerNavigationControllerDelegate(iOS7) 50 /** 51 * 选中联系人的时候会调用 52 * 53 * @param person 被选中的联系人 54 */ 55 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 56 { 57 [self getNameWithPerson:person]; 58 [self getPhoneNumberWithPerson:person]; 59 [peoplePicker dismissViewControllerAnimated:YES completion:nil]; 60 return NO; 61 } 62 63 // iOS7中需要单独实现这个方法, 否则点取消会报错 64 -(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker 65 { 66 [peoplePicker dismissViewControllerAnimated:YES completion:nil]; 67 } 68 69 70 - (void)getPhoneNumberWithPerson:(ABRecordRef)person 71 { 72 // ABMultiValueRef相当于是数组 73 ABMultiValueRef phoneNums = ABRecordCopyValue(person, kABPersonPhoneProperty); 74 CFIndex phonesCount = ABMultiValueGetCount(phoneNums); 75 for (CFIndex index = 0; index < phonesCount; index ++) { 76 NSString *phoneLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phoneNums, index)); 77 NSString *phoneValue = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phoneNums, index)); 78 NSLog(@"%@ : %@", phoneLabel, phoneValue); 79 self.phoneNumLabel.text = [NSString stringWithFormat:@"%@ : %@", phoneLabel, phoneValue]; 80 } 81 // 释放内存 82 CFRelease(phoneNums); 83 } 84 85 // 获取联系人名字 86 - (void)getNameWithPerson:(ABRecordRef)person 87 { 88 // 通过记录来获取信息 89 CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty); 90 CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty); 91 92 93 // (__bridge NSString *) 将对象的所有权交给Foundation框架, 本身并没有释放 94 // NSString *first = (__bridge NSString *)(firstName); 95 // NSString *last = (__bridge NSString *)(lastName); 96 97 // 转换并自动释放原先的对象1 98 NSString *first1 = CFBridgingRelease(firstName); 99 NSString *last1 = CFBridgingRelease(lastName); 100 101 // 转换并自动释放原先的对象2 102 // NSString *first2 = (__bridge_transfer NSString *)(firstName); 103 104 // 释放内存 105 // CFRelease(firstName); 106 // CFRelease(lastName); 107 108 self.nameLabel.text = [NSString stringWithFormat:@"%@, %@", first1, last1]; 109 NSLog(@"%@, %@", first1, last1); 110 } 111 112 @end
原文:http://www.cnblogs.com/Rinpe/p/4766341.html