实用知识:<AddressBookUI/AddressBookUI.h>(获取手机通讯录)
2016-05-05 22:00
501 查看
#import "ViewController.h" // 提供联系人查询, 添加的UI界面 #import <AddressBookUI/AddressBookUI.h> @interface ViewController () <UINavigationControllerDelegate, ABPeoplePickerNavigationControllerDelegate> // 联系人查询控制器 @property (strong, nonatomic) ABPeoplePickerNavigationController *peoplePicker; @end @implementation ViewController - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 1. 创建 self.peoplePicker = [[ABPeoplePickerNavigationController alloc] init]; // 2. 配置 // self.peoplePicker.delegate = self; // 注意: 代理属性是peoplePickerDelegate, delegate属性是从UINavigationController继承过来的 self.peoplePicker.peoplePickerDelegate = self; // 3. 弹出 [self presentViewController:self.peoplePicker animated:YES completion:nil]; } #pragma mark - ABPeoplePickerNavigationControllerDelegate // 点击了右上解的取消按钮时触发 - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker { NSLog(@"取消"); } // 选中了某个联系人时触发 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person { // 如果实现了该代理方法, 那么不会进入联系人详情界面 NSLog(@"选中了联系人"); /*================= 获取联系人的姓名 =================*/ // ABRecordRef : 表示通讯录数据库当中的一条记录 // C 语言的方法通过以自己为方法名开头, 通常第一个参数都Ref是填自己 // person 实际上是 ABPerson, Property ID 定义在 ABPerson 里面 // 凡是create, retain, copy, 都需要手动的去Release // CFTypeRef 是通用类型, 类似于 id CFStringRef firstname = ABRecordCopyValue(person, kABPersonFirstNameProperty); // 名 CFStringRef lastname = ABRecordCopyValue(person, kABPersonLastNameProperty); // 姓 /*================= CoreFoundation 与 Foundation 之间的转换 =================*/ // 方式1: 直接转换, 不转移对象所有权 (负责retainCount引用计数) // NSString *firstNameString = (__bridge NSString *)(f\irstname); // NSLog(@"%@", firstNameString); // // CFRelease(firstname); // 方式2: 将非OC转换成OC, 转移对象所有权 (ARC) // NSString *firstNameString = CFBridgingRelease(firstname); // 两者等价 NSString *firstNameString = (__bridge_transfer NSString *)firstname; NSString *lastNameString = CFBridgingRelease(lastname); NSLog(@"%@ : %@", firstNameString, lastNameString); /*================= 获取联系人电话 =================*/ // kABPersonPhoneProperty 得到的是 ABMultiValueRef 的值 // ABMultiValueRef 可以理解成是一个包装 字典(Label - Value) 的 数组(多个电话) ABMultiValueRef multiValue = ABRecordCopyValue(person, kABPersonPhoneProperty); // 获取MultiValue的值的个数 CFIndex index = ABMultiValueGetCount(multiValue); for (CFIndex i = 0; i < index; i++) { // 获取每一个索引对应的label与value CFStringRef label = ABMultiValueCopyLabelAtIndex(multiValue, i); // 电话号码也是 CFStringRef CFStringRef value = ABMultiValueCopyValueAtIndex(multiValue, i); NSLog(@"%@ : %@", CFBridgingRelease(label), CFBridgingRelease(value)); } CFRelease(multiValue); } @end
相关文章推荐
- Android stuido快捷键集合
- Top K Frequent Elements
- Android Bluetooth(蓝牙)实例
- 【LeetCode-334】Increasing Triplet Subsequence
- Hbuilder适配问题
- [iOS]详解调整UIButton的title和image的位置
- 通过UIWindow创建状态栏的通知
- HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
- HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
- leetcode_095 Unique Binary Search Trees II
- Android基础 | UI检视利器:Hierarchy Viewer
- String、StringBuffer与StringBuilder之间区别
- “java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp”
- tableviewcell自适应高度当中遇到添加label作为contentView,在实际显示时右侧出现空白
- njust 1925 sequence 拆分序列,寻找非降序列的最小个数,不变序列顺序。
- HDU 3836 Equivalent Sets
- HDU 2767 Proving Equivalences 增加最小边使图为强连通
- UIScrollView实现滑动图片
- requests 模拟登录百度
- easyUI获取当前行--代码