iOS-----使用AddressBookUI管理联系人
使用AddressBookUI管理联系人
iOS SDK为管理地址簿提供的视图控制器位于AddressBookUI框架内。总结来说,AddressBookUI框架提供了如下特殊的视图控制器。
|
ABPersonViewController |
用于显示指定联系人数据的试图控制器 |
||||||||||
|
ABNewPersonViewController |
用于新增联系人的视图控制器 |
||||||||||
|
ABPeoplePickerViewController |
用于让用户选择某个联系人或选择某个联系人信息项的视图控制器 |
||||||||||
|
ABUnknownPersonViewController |
用于通过一组联系人信息来添加联系人记录,程序可以将该视图控制器显示的联系人信息存入手机通讯录中。实际上,该视图控制器可以对联系人数据启动这些标准动作:手机通话、发送通信、新增联系人、添加到已有联系人中。 |
||||||||||
|
这4个视图控制器的使用方式基本相同,都是先创建视图控制器的实例,并设置相关属性 -----关键是指定一个xxxDelegate属性,该属性值是一个实现特定协议的对象,该协议中定义的方法负责处理用户对视图控制器执行的操作。 |
|||||||||||
|
4个视图控制器对应的Delegate协议如下: |
|||||||||||
|
ABPersonViewControllerDelegate |
该协议包含一个必须实现的personViewController:shouldPerformDefaultActionForPerson:property:identifier:方法,当用户选中某个联系人的某个属性时激发该方法.如果希望用户选择该属性时自动执行它的默认动作,该方法应该返回YES;否则返回NO. |
||||||||||
|
ABPeoplePickerViewControllerDelegate |
该协议包含如下3个必须实现的方法. - peoplePickerNavigationController:shouldContinueAfterSelectingPerson:当用户通过该协议所对应的视图控制器选中某个联系人后激发该方法.如果希望用户选择该联系人后自动执行默认的动作,该方法应该返回YES;否则返回NO. - peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier::当用户选中某个联系人的某个属性后激发该方法. 如果希望用户选择该联系人后自动执行默认的动作,该方法应该返回YES;否则返回NO. peoplePickerNavigationControllerDidCancel::当用户取消选择时激发该方法 |
||||||||||
|
ABUnknownPersonViewControllerDelegate |
该协议包含一个必须实现的unknownPersonViewController:didResolveToPerson:方法,当用户将未知联系人数据添加为新的联系人或保存到已有联系人中时激发该方法 |
||||||||||
|
这4个视图控制器还可以设置如下常用属性(有些属性不是每个控制器都支持的,具体以API文档为准).
|
|||||||||||
使用ABNewPersonViewController添加联系人
addContact:方法将会使用ABNewPersonViewController添加联系人;unknown:方法将会使用ABUnknownPersonViewController显示未知联系人;pick:方法将会使用ABPersonPickerNavigationController让用户从联系人列表中选择联系人;view:方法将会使用ABPersonViewController显示指定联系人.
|
代 码 片 段 |
- (IBAction)addContact:(id)sender { // 创建ABNewPersonViewController视图控制器 ABNewPersonViewController *controller = [[ABNewPersonViewController alloc] init]; // 设置newPersonViewDelegate属性为当前视图控制器自身 controller.newPersonViewDelegate = self; // 使用UINavigationController包装ABNewPersonViewController UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:controller]; [self presentViewController:nav animated: YES completion: NULL]; } |
|
注意 |
为了让ABNewPersonViewController正常工作,通常需要使用UINavigationController来包装它 |
|
代码片段 |
// ABPersonViewControllerDelegate协议中的方法,当用户单击”保存”或”取消”按钮时激发该方法 - (void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person { // 如果用户单击”保存”按钮,person代表刚保存的记录 // 如果用户单击”取消”按钮,person为NULL if(person) { // 取出person记录中kABPersonFirstNameProperty属性的值 NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); [self showAlert:[NSString *stringWithFormat:@” [%@]联系人被保存 ”, firstName]]; } // 隐藏包装newPersonViewController的导航控制器 [newPersonViewController.navigationController dismissViewControllerAnimated:YES completion:NULL]; } |
使用ABUnknownPersonViewController显示未知联系人
系统将会激发unknown:事件处理方法,该方法将会使用ABUnknownPersonViewController显示一条刚刚新建的联系人的信息.下面是unknown:事件处理方法的代码
- (IBAction)unknown:(id)sender{
ABUnknownPersonViewController* controller = [[ABUnknownPersonViewController alloc] init ];
// 设置unknownPersonViewDelegate属性为当前视图控制器自身
controller. unknownPersonViewDelegate = self;
// 设置显示标准动作
controller.allowsActions = YES;
// 设置允许将该位置的联系人添加到地址簿
controller.allowsAddingToAddressBook = YES;
// 创建一条新的记录
ABRecordRef record = ABPersonCreate();
// 为ABRecordRef记录设置kABPersonFirstNameProperty属性
ABRecordSetValue(record, kABPersonFirstNameProperty, (__bridge CFTypeRef)@”西游记”, NULL);
// 为ABRecordRef记录设置kABPersonLastNameProperty属性
ABRecordSetValue(record, kABPersonLastNameProperty, (__bridge CFTypeRef)@”baidu.com”, NULL);
// 添加联系人电话号码以及该号码对应的标签
ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABPersonPhoneProperty);
ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)@””, (__bridge CFTypeRef)@”工作”, NULL);
ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)@””, (__bridge CFTypeRef)@”手机”, NULL);
// 为ABRecordRef记录设置kABPersonPhoneProperty属性
ABRecordSetValue(record, kABPersonPhoneProperty, multi , NULL);
// 设置controller显示record记录
controller.displayedPerson = record;
// 使用UINavigationController包装ABUnknownPersonViewController
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:nav animated: YES completion:NULL];
}
53// 注意:为了让ABUnknownPersonViewController正常工作,通常需要使用UINavigationController来包装它.
// 视图控制器设置为ABUnknownPersonViewController的unknownPersonViewDelegate属性值,因此在视图控制器中必须实现ABUnknownPersonViewControllerDelegate协议,并实现如下方法
// ABUnknownPersonViewControllerDelegate协议中的方法
// 当用户把这条位置联系人信息添加到某个联系人上,或添加到地址簿中时将会激发该方法
- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person
{
// person代表用户刚刚保存的记录
if(person)
{
// 取出person记录中kABPersonFirstNameProperty属性值
NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
[self showAlert:[NSString stringWithFormat:@”[%@]联系人保存”, firstName]];
}
// 隐藏包装unknownPersonView的导航控制器
[unknownPersonView.navigationController dismissViewControllerAnimated:YES completion:NULL];
}
使用ABPeoplePickerNavigationController选择联系人
用户单击界面上的”选择联系人”按钮,系统将会激发pick:事件处理方法,该方法将会使用ABPeoplePickerNavigationController显示联系人列表供用户选择.下面是pick:事件处理方法的代码
- (IBAction)pick:(id)sender
{
ABPeoplePickerNavigationController* controller = [[ABPepplePickerNavigationController alloc] init];
// 设置peoplePickerDelegate属性为当前视图控制器自身
controller.peoplePickerDelegate = self;
[self presentViewController:controller animated:YES completion:NULL];
}
从上面的代码可以看出,ABPeoplePickerNavigationController的用法更为简单------创建该类的实例,设置peoplePickerDelegate属性,然后将它显示出来即可.
实现ABPeoplePickerNavigationControllerDelegate协议,并实现如下方法
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
// 取消显示peoplePicker视图控制器
// 当peoplePicker视图控制器
[peoplePicker dismissViewControllerAnimated:YES completion:^{
// 创建ABPersonViewController视图控制器
// 取出person记录中kABPersonFirstNameProperty属性值
NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
[self showAlert:[NSString stringWithFormat:@”您选中了[%@]联系人”, firstName]];
}];
return NO;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePickershouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
return NO;
}
- (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController*)peoplePicker
{
NSLog(@”用户取消了选择”);
}
使用ABPersonViewController显示指定联系人
当用户单击程序界面上的”查看ID为1的联系人”按钮时,程序将会激发view:方法,该方法将会使用ABPersonViewController显示指定联系人.限免是view:事件处理方法的代码.
- (IBAction)view:(id)sender
{
ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NULL);
// 获取ID为1的联系人记录
ABRecordRef rec = ABAddressBookGetPersonWithRecordID(ab, );
// 创建ABPersonViewController视图控制器
ABPersonViewController* controller = [[ABPersonViewController alloc] init];
controller.allowsActions = YES;
controller.allowsEditing = YES;
controller.personViewDelegate = self;
// 显示用户选中的联系人记录
controller.displayedPerson = rec;
// 使用UINavigationController包装ABPersonViewController
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:controller];
[self persentViewController: nav animated: YES completion: NULL];
}
实现ABPersonViewControllerDelegate协议,并实现该协议中定义的如下方法.
// 当用户选中某个属性时激发该方法
- (BOOL)peopleViewController:(ABPeopleViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
[self showAlert:[NSString stringWithFormat:@”名字为:%@”, (__bridge NSString*)ABRecordCopyCompositeName(person)]];
[personViewController.navigationController dismissViewControllerAnimated:YES completion:NULL];
return YES;
}
iOS-----使用AddressBookUI管理联系人的更多相关文章
- iOS-----使用AddressBook管理联系人
使用AddressBook管理联系人 iPhone手机通常都是自带的Contacts应用,包括所有联系人的性(last name).名(first name).电话.E-mail地址.住址.生日等各种 ...
- 理解 iOS 的内存管理
远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...
- iOS ARC内存管理
iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...
- android管理联系人操作
ContentProvider扩展之管理系统联系人 我们都知道ContentProvider是用来共享数据的,然而android本身就提供了大量的ContentProvider,例如联系人信息,系统的 ...
- iOS之内存管理(ARC)
iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...
- iOS-----使用addressBook管理联系人之修改联系人
使用addressBook管理联系人之修改联系人 修改联系人 修改联系人先从底层地址簿中加载一条ABRecordRef记录,然后对这条ABRecordRef记录的属性值进行修改,修改完成后把这条修改后 ...
- IOS开发依赖管理工具CocoaPods
CocoaPods IOS开发依赖管理工具 CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It ...
- 说说iOS与内存管理(上)
http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...
- iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)
学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...
随机推荐
- Linux系统——http协议原理
Web服务基础 用户访问网页基本流程 (1)在浏览器中输入域名,系统会查找系统本地的DNS缓存及hosts文件信息,查找是否存在域名对应的IP解析记录 (2)DNS解析域名为IP地址,系统会把浏览器的 ...
- Java实现最基本的集中排序
排序是一个很重要的概念,现实生活中,我们需要为很多的东西排序.下面我们就介绍几种简单的排序的方法和最基本的思想. 1.冒泡排序:假设一个数组中有10个数字,从左边开始
- Python: 矩阵与线性代数运算
需要执行矩阵和线性代数运算,比如矩阵乘法.寻找行列式.求解线性方程组等等. 矩阵类似于3.9 小节中数组对象,但是遵循线性代数的计算规则.下面的一个例子展示了矩阵的一些基本特性: >>&g ...
- 什么是T-SQL
T-SQL T-SQL 即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增强版,它是用来让应用程序与 SQL Server 沟通的主要语言.T-SQL 提供 ...
- 20145104张家明 《Java程序设计》第2周学习总结
20145104张家明 <Java程序设计>第2周学习总结 教材学习内容总结 本周学习了第三章的内容,看过之后呢,学的和c语言是相通的,看起来就是非常的顺畅,自我感觉良好,第三章主要讲了一 ...
- 20155201 2016-2017-2 《Java程序设计》第九周学习总结
20155201 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC全名JavaDataBaseConnecticity,是Jav ...
- 模块的封装之C语言类的继承和派生
[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我 ...
- shell判断文件,目录是否存在或者具有权限的代码
核心代码 #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" #这里的 ...
- 防止putty的鼠标右键错误粘贴
一.环境 发行版:Ubuntu 18.04.1 LTS 代号:bionic 内核版本:4.15.0-30-generic 二.背景 每次从putty复制时,会单击鼠标右击,以便复制出终端的内容,但是一 ...
- Java多线程,线程交替执行
两个线程,一个打印1-100的奇数,一个打印1-100的偶数:要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环. Code: package com.qhong ...