2013-06-28 1 views
3

Мне нужно дать пользователю возможность выбрать номер телефона из адресной книги, поэтому я взял пример из руководства Apple. Но для этого требуется только первый номер, как я могу сделать так, чтобы пользователь мог выбрать один из своих номеров в адресной книге.Доступ к информации для людей в адресной книге 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; 
} 

Edit: обновление для прошивки 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

У меня нет проблем с использованием этого кода, протестированного на моем iPhone 4S с iOS 6. Я использовал его в одном из моих приложений, и я просто скопировал его и ввел его здесь. Не должно быть проблем, если вы не изменили что-то или где-то еще не вызвали номер. – 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; 
}