使用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文档为准).

displayedPerson:

该属性设置或返回该视图控制器显示的联系人记录。该属性值是一个ABRecordRef变量

displayedProperties:

该属性设置或返回视图控制器可以显示的所有属性。该属性值是一个NSArray集合,包含程序希望显示的属性。

addressBook:

该属性设置或返回该视图控制器关联的地址簿,该属性值是一个ABAddressBookRef变量

allowEditing:

该属性设置或返回是否允许编辑联系人的信息。

allowsAddingToAddressBook:

该属性设置或返回是否允许将联系人信息添加到地址簿中。

使用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管理联系人的更多相关文章

  1. iOS-----使用AddressBook管理联系人

    使用AddressBook管理联系人 iPhone手机通常都是自带的Contacts应用,包括所有联系人的性(last name).名(first name).电话.E-mail地址.住址.生日等各种 ...

  2. 理解 iOS 的内存管理

    远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...

  3. iOS ARC内存管理

    iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...

  4. android管理联系人操作

    ContentProvider扩展之管理系统联系人 我们都知道ContentProvider是用来共享数据的,然而android本身就提供了大量的ContentProvider,例如联系人信息,系统的 ...

  5. iOS之内存管理(ARC)

    iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...

  6. iOS-----使用addressBook管理联系人之修改联系人

    使用addressBook管理联系人之修改联系人 修改联系人 修改联系人先从底层地址簿中加载一条ABRecordRef记录,然后对这条ABRecordRef记录的属性值进行修改,修改完成后把这条修改后 ...

  7. IOS开发依赖管理工具CocoaPods

    CocoaPods IOS开发依赖管理工具 CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It ...

  8. 说说iOS与内存管理(上)

    http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...

  9. iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)

    学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...

随机推荐

  1. Selenium IDE编辑区域修改操作学习

    1.修改command.target.value,选择需要修改的步骤,然后点击下方,既可以直接进行修改. 2.添加新的操作步骤:直接在下方编辑区域的下方点击,然后输入或者选择操作类型,然后点击Targ ...

  2. 使用Ajax向服务器端发送请求

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. uva1366 dp

    这题说的是给了 一个矩阵在每个单元内有BLOHHLUM 种的资源 Bi,j, 有YEYENUM 种的 资源Ai,j , 资 源 从 该 单 位 出 发 不能 转 弯 直 接 运 送 到 像 B 类 资 ...

  4. Flume环境安装

    源码包下载: http://archive.apache.org/dist/flume/1.8.0/ 集群环境: master 192.168.1.99 slave1 192.168.1.100 sl ...

  5. nmon监控Linux服务器系统资源

    本文转自:http://www.cnblogs.com/hyzhou/archive/2011/12/29/2305860.html 在实际的测试过程中,Loadrunner监控Linux系统资源不太 ...

  6. mssql查询所有上下级

    if exists (select * from sys.all_objects where name='GetOrgTreeByID') begin drop proc GetOrgTreeByID ...

  7. 20145307陈俊达《网络对抗》Exp2 后门原理与实践

    20145307陈俊达<网络对抗>Exp2 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 非正规网站下载的软件 脚本 或者游戏中附加的第三方插件 例举你知 ...

  8. [UI基础][QQ登陆界面]

    [目标] 1.QQ号码文本框要有“请输入QQ号码”的提示(用户输入时会自动消失) 2.QQ密码文本框要有“请输入QQ密码”的提示(用户输入文字会自动消失) 3.QQ号码文本框只能输入数字 4.QQ密码 ...

  9. CF_884_F(NetFlow)

    codeforces_884_f 题目大意:给出一串长为n的字符串(保证n为偶数),定义反回文串为每一个位置的对应位置上的字母都不等于它(for each i : s[i] != s[n+1-i]), ...

  10. 如何借助 OVN 来提高 OVS 在云计算环境中的性能

    众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...