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];    }

运行程序,大功告成。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 汽车被依非法营运之由扣押怎么办 老婆结婚小孩两个又上夜场该怎么办 对于不断无理要求赔偿的房东怎么办 欠的钱越来越多不知道怎么办了 手机壳的开机按键不好按怎么办 对方把保权的房子卖给我怎么办 内存卡在手机上显示损坏怎么办 内存卡显示但是下载不了东西怎么办 相机sd卡没办法读卡怎么办 尼康相机新sd卡显示满了怎么办 修冰箱没几个月又坏了怎么办 星露谷物语活动中心成了仓库怎么办 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办 最好的朋友的抢了自己的活怎么办 支付宝被实名验证上限了怎么办 装修预留插座被挡了一半怎么办 衣服放在柜子里面有味道怎么办 河北发货一个柜到天津港口怎么办 家用潜水泵更换电容后压力小怎么办 无塔供水井水水位低了怎么办 应急部成立林场的专业灭火队怎么办 路由器我恢复出厂设置断网了怎么办 多囊卵巢综合症不来月经怎么办 天刀普通血战苍梧城没有太白怎么办 天涯明月刀把沈妄言打入水中怎么办 天涯明月刀刷本队友技能太花怎么办 手机收所有短信时显示被隐藏怎么办 div放图片多出的空白怎么办 我14岁射精让我记忆力差了怎么办 qq闪退聊天记录全没了怎么办