访问系统自带通讯录(有界面)

  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
原文地址:https://www.cnblogs.com/Rinpe/p/4766341.html