访问iPhone地址簿中的人员信息

我需要给用户机会从地址簿中select电话号码,所以我拿苹果手册举例说明。 但它只需要第一个号码,我可以如何使用户可以在通讯录中select一个号码。

- (IBAction)adressBook:(UIButton *)sender { ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; picker.peoplePickerDelegate = self; [self presentModalViewController:picker animated:YES]; } - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker { [self dismissModalViewControllerAnimated:YES]; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { [self displayPerson:person]; [self dismissModalViewControllerAnimated:YES]; return NO; } - (void)displayPerson:(ABRecordRef)person { NSString* phone = nil; ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty); if (ABMultiValueGetCount(phoneNumbers) > 0) { phone = (__bridge_transfer NSString*) ABMultiValueCopyValueAtIndex(phoneNumbers, 0); } else { phone = @"[None]"; } self.telNumber.text = phone; CFRelease(phoneNumbers); } 

我用这个来显示电话号码列表,所以我的用户可以select一个:

 - (IBAction)getContact:(id)sender { ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; picker.peoplePickerDelegate = self; picker.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]; [self presentViewController:picker animated:YES completion:nil]; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { // ensure user picked a phone property if(property == kABPersonPhoneProperty) { ABMultiValueRef phone = ABRecordCopyValue(person, property); self.contactTextField.text = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, ABMultiValueGetIndexForIdentifier(phone, identifier)); [self dismissModalViewControllerAnimated:YES]; } else /* Display message if selection is not a phone number */ return NO; } 

编辑:更新了iOS 7和iOS 8

 // Delegate Method for iOS 7 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { // ensure user picked a phone property if(property == kABPersonPhoneProperty) { ABMultiValueRef phone = ABRecordCopyValue(person, property); self.contactTextField.text = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, ABMultiValueGetIndexForIdentifier(phone, identifier)); [self dismissViewControllerAnimated:YES completion:nil]; } else /* Display message if selection is not a phone number */ return NO; } // Delegate Method for iOS 8 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { // Call the delegate method for iOS 7 [self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person property:property identifier:identifier]; } 

这将返回数组,而不是包含所有人拥有的数字。 之后,你可以从数组中select任何数字。

 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { //get the phone number ABMultiValueRef phone = (__bridge ABMultiValueRef)((__bridge NSMutableDictionary *)ABRecordCopyValue(person, kABPersonPhoneProperty)); NSArray *phoneArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phone); NSMutableString *strPhone = [NSMutableString string]; for (int i=0; i<[phoneArray count]; i++) { [strPhone appendString:[NSString stringWithFormat:@"%@,",[phoneArray objectAtIndex:i]]]; } NSLog(@"Dilip phoneArray : %@",phoneArray); NSLog(@"Dilip strPhone : %@",strPhone); phone = nil; phoneArray = nil; strPhone = nil; [peoplePicker dismissModalViewControllerAnimated:YES]; return NO; } 

去接触;

 - (IBAction)getContact:(id)sender{ ABPeoplePickerNavigationController *pickerPhone = [[ABPeoplePickerNavigationController alloc] init]; pickerPhone.peoplePickerDelegate = self; [self presentModalViewController:pickerPhone animated:YES]; [pickerPhone release]; } 

回到应用程序(解除联系人视图):

 - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { [self dismissModalViewControllerAnimated:YES]; } 

使用peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier: delegate方法,它为您提供了有关所选字段的更多信息。

以下代码可能会帮助您:

 -(IBAction)fromAddressBook { ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; picker.peoplePickerDelegate = self; [self presentViewController:picker animated: YES completion:NO]; } - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { [self dismissViewControllerAnimated: YES completion:NO]; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { return YES; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { if (property == kABPersonPhoneProperty) { // if tapped is equal to a phone property CFStringRef cfnumber; ABMultiValueRef numbers = ABRecordCopyValue(person, kABPersonPhoneProperty); for(CFIndex i = 0; i < ABMultiValueGetCount(numbers); i++) { if(identifier == ABMultiValueGetIdentifierAtIndex (numbers, i)) { //if tapped number identifier is the same as identifier number tapped cfnumber = ABMultiValueCopyValueAtIndex(numbers, i); // copy the number to CFSTRING number } } NSString *number = [NSString stringWithFormat:@"%@",cfnumber]; CFRelease(cfnumber); //do anything you want with the number. example, self.notesField.text = number ; } [self dismissViewControllerAnimated:YES completion:nil]; return NO; } -(BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue { if (property == kABPersonPhoneProperty) { ABMultiValueRef numbers = ABRecordCopyValue(person, property); NSString* targetNumber = (__bridge NSString *) ABMultiValueCopyValueAtIndex(numbers, ABMultiValueGetIndexForIdentifier(numbers, identifierForValue)); NSLog(@"%@", targetNumber); } return YES; }