天天看點

iOS9系列專題五——全新的聯系人與聯系人UI架構(二)

2、建立添加聯系人請求:CNSaveRequest

CNSaveRequest是用于存儲聯系人的請求類,通過這個類,我們可以建立批量添加、修改或者删除聯系人的請求,例如添加上面我們建立的聯系人對象:

  //初始化方法

   CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];

   //添加聯系人

   [saveRequest addContact:contact toContainerWithIdentifier:nil];

這個類中還有許多友善我們操作的方法:

@interface CNSaveRequest : NSObject

//添加一個聯系人

- (void)addContact:(CNMutableContact *)contact toContainerWithIdentifier:(nullable NSString *)identifier;

//更新一個聯系人

- (void)updateContact:(CNMutableContact *)contact;

//删除一個聯系人

- (void)deleteContact:(CNMutableContact *)contact;

//添加一組聯系人

- (void)addGroup:(CNMutableGroup *)group toContainerWithIdentifier:(nullable NSString *)identifier;

//更新一組聯系人

- (void)updateGroup:(CNMutableGroup *)group;

//删除一組聯系人

- (void)deleteGroup:(CNMutableGroup *)group;

//向組中添加子組

- (void)addSubgroup:(CNGroup *)subgroup toGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);

//在組中删除子組

- (void)removeSubgroup:(CNGroup *)subgroup fromGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);

//向組中添加成員

- (void)addMember:(CNContact *)contact toGroup:(CNGroup *)group;

//向組中移除成員

- (void)removeMember:(CNContact *)contact fromGroup:(CNGroup *)group;

@end

3、進行聯系人的寫入操作:CNContactStore

CNContactStore是一個用于存取聯系人的上下文橋梁,現在,把我們建立的添加聯系人的請求寫入:

   CNContactStore * store = [[CNContactStore alloc]init];

   [store executeSaveRequest:saveRequest error:nil];

在模拟器上運作程式,打開聯系人,效果如下:

聯系人界面:

聯系人詳情:

三、擷取格式化的聯系人資訊

iOS9中,ContactFramework也為開發者提供了非常友善的格式化資訊的方法,還拿我們上面建立的聯系人對象舉例:

1、擷取格式化的聯系人姓名

   NSString * foematter =[CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName];

   NSLog(@"%@",foematter);

這個運作後會列印出jaki zhang,其中style風格枚舉如下:

typedef NS_ENUM(NSInteger, CNContactFormatterStyle)

{

   //擷取全名

   CNContactFormatterStyleFullName,

  //擷取拼音全名

   CNContactFormatterStylePhoneticFullName,

} NS_ENUM_AVAILABLE(10_11, 9_0);

2、擷取格式化的聯系人位址

   NSString * foematter =[CNPostalAddressFormatter stringFromPostalAddress:homeAdress style:CNPostalAddressFormatterStyleMailingAddress];

列印如下:

iOS9系列專題五——全新的聯系人與聯系人UI架構(二)

四、提取聯系人

       在開發中,提取聯系人的使用率要遠遠高于建立聯系人,ContactFramework提取聯系人的方式,類似于資料庫的檢索方式,通過配置條件,提取出我們需要的資料,例如:

   CNContactStore * stroe = [[CNContactStore alloc]init];

   //檢索條件,檢索所有名字中有zhang的聯系人

   NSPredicate * predicate = [CNContact predicateForContactsMatchingName:@"zhang"];

   //提取資料

   NSArray * contacts = [stroe unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];

keysToFetch是設定提取聯系人的哪些資料,如上則隻提取出檢索聯系人的名字。

同樣,也可以通過請求的方式來對聯系人進行周遊:

   CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactPhoneticFamilyNameKey]];

   [stroe enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {

       NSLog(@"%@",contact);

   }];

五、ContactFramework UI相關

iOS9中,系統也為我們封裝好了一套聯系人的UI界面,用起來也十分友善,主要新增的controller有兩個:

CNContactPickerViewController:展示聯系人清單的controller

CNContactViewController:展示聯系人詳細資訊的controller

示例如下:

彈出聯系人清單:

   CNContactPickerViewController * con = [[CNContactPickerViewController alloc]init];

   [self presentViewController:con animated:YES completion:nil];

效果如下:

iOS9系列專題五——全新的聯系人與聯系人UI架構(二)

聯系人邏輯的相關處理主要在CNContactPickerDelegate中完成:

//視圖取消時 調用的方法

- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;

//選中與取消選中時調用的方法

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;

CNContactViewController則是用來顯示具體聯系人的詳細資訊的,比如:

   CNContactViewController * con = [CNContactViewController viewControllerForContact:contact];

相關代理回調函數如下:

//将要展示聯系人資訊與已經展示聯系人資訊的回調

- (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;

- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;