2013-06-28 67 views
3

我需要給用戶機會從地址簿中選擇電話號碼,所以我拿了蘋果手冊中的示例。但它只需要第一個號碼,我可以如何讓用戶可以在地址簿中選擇一個號碼。訪問iPhone地址簿中的人信息

- (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); 
} 
+0

因爲您使用ABMultiValueCopyValueAtIndex(phoneNumbers,0)指定了第一個索引,所以得到第一個數字; –

回答

4

我用它來顯示電話號碼的列表,以便我的用戶可以選擇一個:

- (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]; 
} 
+0

您的代碼在模擬器中效果很好,但是當我在手機上嘗試時,它會從地址簿中撥打電話號碼並呼叫此號碼。你有這樣的問題嗎? – vZ10

+0

我沒有使用這個代碼的問題,在iOS 6的iPhone 4S上測試過。我在我的一個應用程序中使用它,我只是複製並粘貼到這裏。應該沒有問題,除非你修改了一些東西或其他地方的號碼。 – Rick

0

使用peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:委託方法,該方法爲您提供有關所選字段的更多信息。

1

爲了找到聯繫人;

- (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]; 
} 
2

這將返回數組不是包含所有的人都有數。之後,你可以從數組中選擇任何數字。

- (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; 
} 
0

繼代碼可能會幫助你:

-(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; 
}