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