iOS SDK為管理地址簿提供的視圖控制器位于AddressBookUI框架內??偨Y來說,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文檔為準).
|
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];
} |
系統將會激發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包裝ABUnknownPersonViewController46 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)person62 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 }
用戶單擊界面上的”選擇聯系人”按鈕,系統將會激發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)person20 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)identifier44 45 {46 47 return NO;48 49 }50 51 - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController*)peoplePicker52 53 {54 55 NSLog(@”用戶取消了選擇”);56 57 }
當用戶單擊程序界面上的”查看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包裝ABPersonViewController26 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)identifier40 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 }
新聞熱點
疑難解答