iOS:ABPeoplePickerNavigationController系统通讯录使用
来源:互联网 发布:淘宝哪里能买到真蜂蜜 编辑:程序博客网 时间:2024/05/01 04:09
因项目需求要访问系统通讯录获取电话号码,于是乎从一无所知,开始倒腾,倒腾了一下午,总算了弄好了。写这边博客是为了记录一下,自己下一次弄的时候就别在出错了。同时,有和我一样的菜鸟能够避免走一下弯路。
好了,言归正传,要访问系统的通讯录,首先需要添加AddressBook.framework
和 AddressBookUI.framework
两个框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了。
首先我们需要创建一个控制器:ViewController,在.h文件中导入头文件:<AddressBook/AddressBook.h>、 <AddressBookUI/AddressBookUI.h>,
#import <AddressBook/AddressBook.h>#import <AddressBookUI/AddressBookUI.h>
然后在控制器实现 ABPeoplePickerNavigationControllerDelegate, UINavigationControllerDelegate协议
@interface ViewController ()<ABPeoplePickerNavigationControllerDelegate, UINavigationControllerDelegate>
在viewDidAppear方法中创建ABPeoplePickerNavigationController,同时设置viewController作为委托对象
- (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; ABPeoplePickerNavigationController *pNC = [[ABPeoplePickerNavigationController alloc] init]; pNC.peoplePickerDelegate = self; [self presentViewController:pNC animated:YES completion:nil];}
接下来需要实现ABPeoplePickerNavigationControllerDelegate协议
#pragma mark - ABPeoplePickerNavigationControllerDelegate- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); long index = ABMultiValueGetIndexForIdentifier(phone,identifier); NSString *phoneNO = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, index); phoneNO = [phoneNO stringByReplacingOccurrencesOfString:@"-" withString:@""]; NSLog(@"%@", phoneNO); if (phone && phoneNO.length == 11) { [peoplePicker dismissViewControllerAnimated:YES completion:nil]; return; }else{ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误提示" message:@"请选择正确手机号" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; }}- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0){ ABPersonViewController *personViewController = [[ABPersonViewController alloc] init]; personViewController.displayedPerson = person; [peoplePicker pushViewController:personViewController animated:YES];}- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{ [peoplePicker dismissViewControllerAnimated:YES completion:nil];}- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person NS_DEPRECATED_IOS(2_0, 8_0){ return YES;}- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_DEPRECATED_IOS(2_0, 8_0){ ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); long index = ABMultiValueGetIndexForIdentifier(phone,identifier); NSString *phoneNO = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, index); phoneNO = [phoneNO stringByReplacingOccurrencesOfString:@"-" withString:@""]; NSLog(@"%@", phoneNO); if (phone && phoneNO.length == 11) { [peoplePicker dismissViewControllerAnimated:YES completion:nil]; return NO; }else{ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误提示" message:@"请选择正确手机号" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; } return YES;}@end
到这里本以为大功告成,的确在iOS7是没有任何问题,但是iOS8出现了坑爹的问题,就是选择联系人后
ABPeoplePickerNavigationController会自动dismiss掉,这个问题可坑坏我了。问了谷歌和度娘,在stackvoerflow找到了类似的问题,但是都没有得到解决,在觉得没有办法的时候,又开始看ABPeoplePickerNavigationController.h的头文件,发现了
predicateForSelectionOfPerson属性,于是乎在viewDidAppear方法中加入如下代码:
if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0){ pNC.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false]; }
运行程序,大功告成。
- iOS:ABPeoplePickerNavigationController系统通讯录使用
- ABPeoplePickerNavigationController系统通讯录使用
- 30.ios 8 访问通讯录兼容问题,ABPeoplePickerNavigationController
- iOS - ABPeoplePickerNavigationController 获取手机通讯录信息
- 不同iOS系统版本下ABPeoplePickerNavigationController和ABAddressBook访问系统通讯录的区别
- 如何使用iOS AddressBook , ABPeoplePickerNavigationController
- IOS系统通讯录的使用
- ABPeoplePickerNavigationController
- ABPeoplePickerNavigationController
- ios调用系统通讯录
- ios 调用系统通讯录
- iOS 获取系统通讯录
- [iOS] iOS6 iOS7 访问和使用系统通讯录
- IOS获取系统通讯录使用权限的优雅方式
- iOS 使用ContactsUI保存新联系人到系统通讯录
- [iOS]修改ABPeoplePickerNavigationController导航栏颜色
- iOS开发之系统通讯录
- iOS系统打开手机通讯录
- 统计学习方法
- 数据类型和运算符(运算符)
- sizeof与offsetof有关的结构体详解
- 解决android有的手机拍照后上传图片被旋转的问题
- 码农必备技能:烂代码的处理之道
- iOS:ABPeoplePickerNavigationController系统通讯录使用
- 流程控制与数组(分支结构)
- VS2012 +MFC+ OPenGL环境搭建
- PAT乙级 跟奥巴马一起编程(15)
- 流程控制与数组(控制循环结构)
- 欢迎使用CSDN-markdown编辑器
- 流程控制与数组(goto语句)
- 用十条命令在一分钟内检查Linux服务器性能
- 城市链表-JAVA LinkedList