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


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:事件处理方法的代码

 1 - (IBAction)unknown:(id)sender{
 2
 3   ABUnknownPersonViewController* controller = [[ABUnknownPersonViewController alloc] init ];
 4
 5 // 设置unknownPersonViewDelegate属性为当前视图控制器自身
 6
 7 controller. unknownPersonViewDelegate = self;
 8
 9 // 设置显示标准动作
10
11 controller.allowsActions = YES;
12
13 // 设置允许将该位置的联系人添加到地址簿
14
15 controller.allowsAddingToAddressBook = YES;
16
17 // 创建一条新的记录
18
19 ABRecordRef record = ABPersonCreate();
20
21 // 为ABRecordRef记录设置kABPersonFirstNameProperty属性
22
23 ABRecordSetValue(record,  kABPersonFirstNameProperty,  (__bridge CFTypeRef)@”西游记”, NULL);
24
25 // 为ABRecordRef记录设置kABPersonLastNameProperty属性
26
27 ABRecordSetValue(record,  kABPersonLastNameProperty,  (__bridge CFTypeRef)@”baidu.com”, NULL);
28
29 // 添加联系人电话号码以及该号码对应的标签
30
31 ABMutableMultiValueRef  multi = ABMultiValueCreateMutable(kABPersonPhoneProperty);
32
33 ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)@”02028309358”, (__bridge CFTypeRef)@”工作”, NULL);
34
35 ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)@”13500008888”, (__bridge CFTypeRef)@”手机”, NULL);
36
37 // 为ABRecordRef记录设置kABPersonPhoneProperty属性
38
39 ABRecordSetValue(record,  kABPersonPhoneProperty, multi , NULL);
40
41 // 设置controller显示record记录
42
43 controller.displayedPerson = record;
44
45 // 使用UINavigationController包装ABUnknownPersonViewController
46
47 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:controller];
48
49 [self presentViewController:nav animated: YES  completion:NULL];
50
51 }
52
53//  注意:为了让ABUnknownPersonViewController正常工作,通常需要使用UINavigationController来包装它.
54
55 // 视图控制器设置为ABUnknownPersonViewController的unknownPersonViewDelegate属性值,因此在视图控制器中必须实现ABUnknownPersonViewControllerDelegate协议,并实现如下方法
56
57 // ABUnknownPersonViewControllerDelegate协议中的方法
58
59 // 当用户把这条位置联系人信息添加到某个联系人上,或添加到地址簿中时将会激发该方法
60
61 - (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView  didResolveToPerson:(ABRecordRef)person
62
63 {
64
65    // person代表用户刚刚保存的记录
66
67   if(person)
68
69 {
70
71 //  取出person记录中kABPersonFirstNameProperty属性值
72
73 NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
74
75 [self  showAlert:[NSString stringWithFormat:@”[%@]联系人保存”, firstName]];
76
77 }
78
79 // 隐藏包装unknownPersonView的导航控制器
80
81 [unknownPersonView.navigationController  dismissViewControllerAnimated:YES completion:NULL];
82
83 }

使用ABPeoplePickerNavigationController选择联系人

用户单击界面上的”选择联系人”按钮,系统将会激发pick:事件处理方法,该方法将会使用ABPeoplePickerNavigationController显示联系人列表供用户选择.下面是pick:事件处理方法的代码

 1 - (IBAction)pick:(id)sender
 2
 3 {
 4
 5    ABPeoplePickerNavigationController* controller = [[ABPepplePickerNavigationController alloc] init];
 6
 7    // 设置peoplePickerDelegate属性为当前视图控制器自身
 8
 9    controller.peoplePickerDelegate = self;
10
11    [self presentViewController:controller animated:YES completion:NULL];
12
13 }
14
15 从上面的代码可以看出,ABPeoplePickerNavigationController的用法更为简单------创建该类的实例,设置peoplePickerDelegate属性,然后将它显示出来即可.
16
17 实现ABPeoplePickerNavigationControllerDelegate协议,并实现如下方法
18
19 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
20
21 {
22
23    // 取消显示peoplePicker视图控制器
24
25    // 当peoplePicker视图控制器
26
27    [peoplePicker dismissViewControllerAnimated:YES completion:^{
28
29   // 创建ABPersonViewController视图控制器
30
31   // 取出person记录中kABPersonFirstNameProperty属性值
32
33   NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
34
35   [self showAlert:[NSString stringWithFormat:@”您选中了[%@]联系人”, firstName]];
36
37 }];
38
39 return NO;
40
41 }
42
43 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePickershouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
44
45 {
46
47    return NO;
48
49 }
50
51 - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController*)peoplePicker
52
53 {
54
55   NSLog(@”用户取消了选择”);
56
57 }

使用ABPersonViewController显示指定联系人

当用户单击程序界面上的”查看ID为1的联系人”按钮时,程序将会激发view:方法,该方法将会使用ABPersonViewController显示指定联系人.限免是view:事件处理方法的代码.

 1 - (IBAction)view:(id)sender
 2
 3 {
 4
 5   ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NULL);
 6
 7   // 获取ID为1的联系人记录
 8
 9   ABRecordRef rec = ABAddressBookGetPersonWithRecordID(ab, 1);
10
11   // 创建ABPersonViewController视图控制器
12
13  ABPersonViewController* controller = [[ABPersonViewController alloc] init];
14
15  controller.allowsActions = YES;
16
17  controller.allowsEditing = YES;
18
19  controller.personViewDelegate = self;
20
21  // 显示用户选中的联系人记录
22
23 controller.displayedPerson = rec;
24
25 // 使用UINavigationController包装ABPersonViewController
26
27 UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:controller];
28
29 [self persentViewController: nav animated: YES completion: NULL];
30
31 }
32
33 实现ABPersonViewControllerDelegate协议,并实现该协议中定义的如下方法.
34
35 // 当用户选中某个属性时激发该方法
36
37
38
39 - (BOOL)peopleViewController:(ABPeopleViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
40
41 {
42
43   [self showAlert:[NSString stringWithFormat:@”名字为:%@”, (__bridge NSString*)ABRecordCopyCompositeName(person)]];
44
45   [personViewController.navigationController dismissViewControllerAnimated:YES completion:NULL];
46
47  return YES;
48
49 }
时间: 2024-08-03 06:04:33

iOS-----使用AddressBookUI管理联系人的相关文章

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

使用AddressBook管理联系人 iPhone手机通常都是自带的Contacts应用,包括所有联系人的性(last name).名(first name).电话.E-mail地址.住址.生日等各种个人信息.Contacts的数据将保存在自己的应用程序沙盒中,其他应用不能访问它们. 为了能访问iPhone手机存储的联系人信息,iOS系统提供了如下两个框架. AddressBook.framework 通过该框架提供的系列函数,我们可以开发程序界面对手机中的联系人信息进行增.删.改.查. Add

说说iOS与内存管理(上)

http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责释放”这种基本原则是很重要的,但不是本文要讨论的重点.之前本人还没在小站发过相关的文章,本篇文章中,我本人是想结合实际开发和调试中遇到的一些细节问题,来谈谈iOS的内存管理内在机制和调试方法. 上一篇文章已经是4月份的了,时间飞快又过去了好久,小站5月份没有文章更新,罪过罪过.最近小站的站长我又转换

理解 iOS 的内存管理

理解 iOS 的内存管理 远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳,而我还是一个默默无闻的刚毕业的小子.那个时候的 iOS 开发过程是这样的: 我们先写好一段 iOS 的代码,然后屏住呼吸,开始运行它,不出所料,它崩溃了.在 MRC 时代,即使是最牛逼的 iOS 开发者,也不能保证一次性就写出完美的内存管理代码.于是,我们开始一步一步调试

Exchange 2013 PowerShell管理联系人&通讯组&资源邮箱

管理联系人 创建联系人,使用如下语法: New-MailContact -Alias rjones ` -Name "Rob Jones" ` -ExternalEmailAddress [email protected] ` -OrganizationalUnit sales 已启用邮箱的用户可以使用如下语法: New-MailUser -Name 'John Davis' ` -Alias jdavis ` -UserPrincipalName [email protected]

android管理联系人操作

ContentProvider扩展之管理系统联系人 我们都知道ContentProvider是用来共享数据的,然而android本身就提供了大量的ContentProvider,例如联系人信息,系统的多媒体信息等,这些系统的ContentProvider都提供了供其他应用程序访问的Uri,开发者可以通过ContentResolver来调用系统的ContentProvider提供的insert()/update()/delete()/query()方法,从而实现自己的需求. 1.了解系统联系人的结

总结 IOS 7 内存管理

[iOS7的一些总结]5.iOS中的内存管理 我们知道,为了更加方便地处理内存管理问题,将开发人员从繁琐的内存的分配和释放工作中解放出来而专注于产品和逻辑,iOS提供了一种有效的方法, 即自动引用计数ARC.采用了ARC之后,绝大部分内存管理的问题就不需要我们继续操心了.但是从另一个方面讲,这个方便的工具也助长了程序员的懒惰情 绪,很多新手和学生甚至连引用计数的含义都不清楚.的确,这部分内容相对比较难以理解,不过如果能深刻地领悟之后将会是未来学习和开发中的强大助推器. 1.关于对象所有权的概念:

ios代码分块管理的一些方法

ios代码分块管理的一些方法 by 伍雪颖 内联的写法: self.backgroundView = ({ UIView *view = [[UIView alloc] initWithFrame:self.view.bounds]; view.backgroundColor = [UIColor redColor]; view.alpha = 0.8f; view; }); [self.view addSubview:self.backgroundView]; block的写法: self.b

iOS第三管理工具pods

iOS第三管理工具pods的安装与使用步骤如下 1.安装 ----在终端输入代码     sudo gem install cocoapods   (有朋友问要不要配置ruby环境,我说不用配置有xcode就行 )  2.替换 ----替换淘宝的ruby镜像,解决不用翻墙问题         先删除原来的ruby镜像  gem sources –remove https://rubygems.org/ 再安装淘宝的ruby镜像  gem sources –a http://ruby.taobao

iOS之内存管理(ARC)

iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方面要注意的地方. Autorelease 提到内存管理,就不得不提autorelease,虽然我们平时开发中很少会感知到它的存在.autorelease就是自动释放的意思,如果变量使用autorelease来修饰,就表明变量的释放由系统来完成. autoreleasepool是由runloop在开启