iOS开发之AddressBookUI框架详解

iOS开发之AddressBookUI框架详解

一、关于AddressBookUI框架

    AddressbookUI是iOS开发框架中提供的一套通讯录界面组件。其中封装好了一套选择联系人,查看联系人的界面,在需要时开发者可以直接调用。当然对于联系人界面,开发者也可以进行完全的自定义,下面链接博客中介绍了如何使用AddressBook框架操作通讯录与联系人。

https://my.oschina.net/u/2340880/blog/1930414

    AddressBookUI框架主要提供了如下几个类:

ABNewPersonViewController:新建联系人界面视图控制器

ABPeoplePickerNavigationController:从通讯录选择联系人界面视图控制器

ABPersonViewController:联系人详情界面视图控制器

ABUnknownPersonViewController:一个未在当前通讯录中的联系人查看界面,可以添加和编辑

二、ABNewPersonViewController新建联系人界面

    ABNewPersonViewController类的使用非常简单,示例如下:

ABNewPersonViewController *picker = [[ABNewPersonViewController alloc] init];
picker.newPersonViewDelegate = self;
[self presentModalViewController:picker animated:YES];

效果如下图所示:

ABNewPersonViewController解析如下:

//代理
@property(nonatomic,assign,nullable) id<ABNewPersonViewControllerDelegate> newPersonViewDelegate;
//通讯录实例 只读
@property(nonatomic,readwrite,nullable) ABAddressBookRef addressBook;
//联系人 只读
@property(nonatomic,readwrite,nullable) ABRecordRef displayedPerson;
//联系人组 只读
@property(nonatomic,readwrite,nullable) ABRecordRef parentGroup;

联系人的新建回调可以在代理方法中处理,如下:

@protocol ABNewPersonViewControllerDelegate <NSObject>
//新建联系人完成后的回调
- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(nullable ABRecordRef)person;
@end

三、ABPeoplePickerNavigationController选择联系人界面

    ABPeoplePickerNavigationController是用户通讯录界面,开发者在需要用户选择联系人时,可以直接调用这个界面来让用户进行选择,示例如下:

ABPeoplePickerNavigationController *vc = [[ABPeoplePickerNavigationController alloc] init];
vc.peoplePickerDelegate = self;
[self presentViewController:vc animated:YES completion:nil];

效果如下图:

ABPeoplePickerNavigationController解析如下:

//代理
@property(nonatomic,assign,nullable) id<ABPeoplePickerNavigationControllerDelegate> peoplePickerDelegate;
//需要展示的用户联系人属性字段  数组中为属性的ID 在AddressBook框架介绍的博客中有讲解
@property(nonatomic,copy,nullable) NSArray<NSNumber*> *displayedProperties;
//通讯录实例
@property(nonatomic,readwrite,nullable) ABAddressBookRef addressBook;
//设置一个筛选条件 过滤掉不可显示的联系人
@property(nonatomic,copy,nullable) NSPredicate *predicateForEnablingPerson;
//设置一个筛选条件 过滤掉不可选择的联系人
@property(nonatomic,copy,nullable) NSPredicate *predicateForSelectionOfPerson;
//设置一个筛选条件 过滤掉不可显示的属性
@property(nonatomic,copy,nullable) NSPredicate *predicateForSelectionOfProperty;

用来进行联系人筛选的属性定义如下:

extern NSString * const ABPersonNamePrefixProperty NS_AVAILABLE_IOS(8_0);
extern NSString * const ABPersonGivenNameProperty NS_AVAILABLE_IOS(8_0); 
extern NSString * const ABPersonMiddleNameProperty NS_AVAILABLE_IOS(8_0); 
extern NSString * const ABPersonFamilyNameProperty NS_AVAILABLE_IOS(8_0);  
extern NSString * const ABPersonNameSuffixProperty NS_AVAILABLE_IOS(8_0); 
extern NSString * const ABPersonPreviousFamilyNameProperty NS_AVAILABLE_IOS(8_0);  
extern NSString * const ABPersonNicknameProperty NS_AVAILABLE_IOS(8_0); 
extern NSString * const ABPersonPhoneticGivenNameProperty NS_AVAILABLE_IOS(8_0);  
extern NSString * const ABPersonPhoneticMiddleNameProperty NS_AVAILABLE_IOS(8_0); 
extern NSString * const ABPersonPhoneticFamilyNameProperty NS_AVAILABLE_IOS(8_0);    
extern NSString * const ABPersonOrganizationNameProperty NS_AVAILABLE_IOS(8_0);        
extern NSString * const ABPersonDepartmentNameProperty NS_AVAILABLE_IOS(8_0);       
extern NSString * const ABPersonJobTitleProperty NS_AVAILABLE_IOS(8_0);          
extern NSString * const ABPersonBirthdayProperty NS_AVAILABLE_IOS(8_0);        
extern NSString * const ABPersonNoteProperty NS_AVAILABLE_IOS(8_0);      
extern NSString * const ABPersonPhoneNumbersProperty NS_AVAILABLE_IOS(8_0);   
extern NSString * const ABPersonEmailAddressesProperty NS_AVAILABLE_IOS(8_0);  
extern NSString * const ABPersonUrlAddressesProperty NS_AVAILABLE_IOS(8_0);  
extern NSString * const ABPersonDatesProperty NS_AVAILABLE_IOS(8_0);    
extern NSString * const ABPersonInstantMessageAddressesProperty NS_AVAILABLE_IOS(8_0); 
extern NSString * const ABPersonRelatedNamesProperty NS_AVAILABLE_IOS(8_0);     
extern NSString * const ABPersonSocialProfilesProperty NS_AVAILABLE_IOS(8_0); 
extern NSString * const ABPersonPostalAddressesProperty NS_AVAILABLE_IOS(8_0);

ABPeoplePickerNavigationControllerDelegate中方法解释如下:

//选中联系人进行回调
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person;
//选择联系人属性
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier;
//取消选择
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker;

四、ABPersonViewController联系人详情界面

    ABPersonViewController是联系人的详情展示界面,简单使用如下:

CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
ABRecordRef person = CFArrayGetValueAtIndex(peopleArray, 0);
ABPersonViewController *viewController = [[ABPersonViewController alloc] init];
viewController.personViewDelegate = self;
viewController.displayedPerson = person;
viewController.allowsActions = NO;
viewController.allowsEditing = YES;
viewController.displayedProperties = @[[NSNumber numberWithInt:kABPersonPhoneProperty]];
[self presentViewController:viewController animated:YES completion:nil];

界面如下:

ABPersonViewController中常用属性方法解析如下:

//代理
@property(nonatomic,assign,nullable) id<ABPersonViewControllerDelegate> personViewDelegate;
//通讯录实例
@property(nonatomic,readwrite,nullable) ABAddressBookRef addressBook;
//联系人记录实例
@property(nonatomic,readwrite) ABRecordRef displayedPerson;
//展示的属性字段
@property(nonatomic,copy,nullable) NSArray<NSNumber*> *displayedProperties;
//是否允许编辑
@property(nonatomic) BOOL allowsEditing;
//是否允许活动按钮 例如分享
@property(nonatomic) BOOL allowsActions;
//是否允许关联其他联系人
@property(nonatomic) BOOL shouldShowLinkedPeople;
//设置属性高亮
- (void)setHighlightedItemForProperty:(ABPropertyID)property withIdentifier:(ABMultiValueIdentifier)identifier;

ABPersonViewControllerDelegate中方法解释如下:

//选择属性发送时调用
- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier;

五、关于ABUnknownPersonViewController

     ABUnknownPersonViewController界面与ABPersonViewController基本一致,不同的是,ABPersonViewController需要使用一个通讯录中已经存在的联系人作为参数进行展示,ABUnknownPersonViewController则不然,你可以使用一个通讯录中不存在的联系人对象来进行界面的渲染,并且支持用户选择将此联系人存入通讯录中。示例如下:

ABUnknownPersonViewController *unknown=[[ABUnknownPersonViewController alloc]init];
unknown.displayedPerson=ABPersonCreate();
unknown.allowsAddingToAddressBook=YES;//允许添加
[self presentViewController:unknown animated:YES completion:nil];

ABUnknownPersonViewController中属性方法解释如下:

//代理
@property(nonatomic,assign,nullable) id<ABUnknownPersonViewControllerDelegate> unknownPersonViewDelegate;
//通讯录实例对象
@property(nonatomic,readwrite,nullable) ABAddressBookRef addressBook;
//联系人实例
@property(nonatomic,readwrite) ABRecordRef displayedPerson;
//提示名字
@property(nonatomic,copy,nullable) NSString *alternateName;
//提示信息
@property(nonatomic,copy,nullable) NSString *message;
//是否允许活动
@property(nonatomic) BOOL allowsActions;
//是否允许添加电话本
@property(nonatomic) BOOL allowsAddingToAddressBook;

ABUnknownPersonViewControllerDelegate方法:

//联系人解释时调用
- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownCardViewController didResolveToPerson:(nullable ABRecordRef)person;
//发送活动
- (BOOL)unknownPersonViewController:(ABUnknownPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

使用pt-table-checksum校验MySQL主从复制

pt-table-checksum是一个基于MySQL数据库主从架构在线数据一致性校验工具。其工作原理在主库上运行, 通过对同步的表在主从段执行checksum...

2332
来自专栏C++

Windows核心编程:第5章 作业

1471
来自专栏沃趣科技

Log Miner 挖挖挖

Log Miner是Oracle自Oracle 8i以后推出的一个可以分析数据库redo log和archivelog内容的工具,可以通过日志分析所有对数据库的...

1525
来自专栏Java学习123

powerdesigner 15 如何导出sql schema

2975
来自专栏乐沙弥的世界

启用用户进程跟踪

仅仅需要标识该会话并为该会话启用跟踪(专用模式为一对一模式,即一个用户进程对应一个服务器进程)

922
来自专栏数据和云

Oracle 18c新特性:Schema-Only 帐号提升应用管理安全性

在 Oracle 18c 中,一个特殊类型的帐号被引入到数据库当中,这特特性被称为 Schema-Only 帐号,这个帐号通过 NO AUTHENTICATIO...

1304
来自专栏更流畅、简洁的软件开发方式

检查两个数据库里的表名、字段是否一致的一种方法

不知道大家有没有遇到过这种情况。 程序已经给客户安装上了,并且客户已经录入了一些信息,然后程序还需要作比较大的变动(修改功能、增加模块等),数据库就不可避免要...

2828
来自专栏杨建荣的学习笔记

通过ORA错误反思sql语句规范(r4笔记第41天)

今天快下班的时候,有个开发的同事问我一个问题,说他在客户端执行一条sql语句,里面包含子查询,如果单独执行子查询,会报"invalid identifier"...

2513
来自专栏Hadoop实操

如何使用StreamSets实现Oracle中变化数据实时写入Kudu

9285
来自专栏数据和云

案发现场:被注入的软件及 ORA-600 16703 灾难的恢复

最近帮助一个客户恢复数据库,遇到了如下这个问题。让我们再一次惊醒于数据安全,如果不做好防范,问题总是会来得猝不及防。

2544

扫码关注云+社区

领取腾讯云代金券