如何从地址簿ios8中选择联系人

时间:2014-09-24 11:34:23

标签: ios objective-c

我已经在ios7上使用iOS应用程序,现在我将其升级到ios8,并且看到有一种新的方式来选择联系人。

我现在所做的是:

-(void)showABNewPersonViewController{
    //Calling the addresbook
    ABPeoplePickerNavigationController *picker =
    [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    [self presentViewController:picker animated:YES completion:nil];
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{

    //Getting contact email and phone number then assign it to there tb's.
    ABMultiValueRef emails = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonEmailProperty);
    CFStringRef emailID = ABMultiValueCopyValueAtIndex(emails, 0);
    _tbContactPersonEmail.text = [NSString stringWithFormat:@"%@", emailID];
    CFRelease(emailID);
    CFRelease(emails);

    ABMultiValueRef phone = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonPhoneProperty);
    CFStringRef phoneID = ABMultiValueCopyValueAtIndex(phone, 0);
    _tbContactPersonPhone.text = [NSString stringWithFormat:@"%@", phoneID];
    CFRelease(phoneID);
    CFRelease(phone);

    [self fieldValueChanged:nil];

    [self dismissViewControllerAnimated:YES completion:nil];
    return NO;
}
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
    return NO;
}
-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
    [self dismissViewControllerAnimated:YES completion:nil];
}

使用该代码我可以打开地址簿并选择一个联系人,但现在它没有返回他/她的姓名和编号,而是打开所选联系人的详细视图。

我的peoplePickerNavigationController未被调用

感谢您的帮助和快速回答¨

3 个答案:

答案 0 :(得分:12)

要在iOS 8中选择联系人,您需要使用:

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person {

....// do whatever you need here

}

当然,您需要首先符合ABPeoplePickerNavigationControllerDelegate

示例:

-(void)openPeoplePicker
{
        ABPeoplePickerNavigationController *personPicker = [ABPeoplePickerNavigationController new];

        personPicker.peoplePickerDelegate = self;
        [self presentViewController:personPicker animated:YES completion:nil];
}

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person {

    NSString *firstName;
    NSString *middleName;
    NSString *lastName;
    NSDate *retrievedDate;
    UIImage *retrievedImage;

    // get the first name
    firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);

    //get the middle name
    middleName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonMiddleNameProperty);

    // get the last name
    lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

    // get the birthday
    retrievedDate = (__bridge_transfer NSDate*)ABRecordCopyValue(person, kABPersonBirthdayProperty);

    // get personPicture
    if (person != nil && ABPersonHasImageData(person))
    {
        retrievedImage = [UIImage imageWithData:(__bridge_transfer NSData*)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)];
    }
    else
    {
        retrievedImage = nil;
    }

    //set the name
    if (firstName != NULL && middleName != NULL && lastName != NULL)
    {
        retrievedName = [[NSString alloc] initWithFormat:@"%@ %@ %@",firstName,middleName,lastName];
    }

    if (firstName != NULL && middleName != NULL & lastName == NULL)
    {
        retrievedName = [[NSString alloc] initWithFormat:@"%@ %@",firstName, middleName];
    }

    if (firstName != NULL && middleName == NULL && lastName != NULL)
    {
        retrievedName = [[NSString alloc] initWithFormat:@"%@ %@",firstName,lastName];
    }

    if (firstName != NULL && middleName == NULL && lastName == NULL)
    {
        retrievedName = [[NSString alloc] initWithFormat:@"%@",firstName];
    }

    if (firstName == NULL && middleName != NULL && lastName != NULL)
    {
        retrievedName = [[NSString alloc] initWithFormat:@"%@ %@",middleName, lastName];
    }

    if (firstName == NULL && middleName != NULL && lastName == NULL)
    {
        retrievedName = [[NSString alloc] initWithFormat:@"%@",middleName];
    }

    if (firstName == NULL && middleName == NULL && lastName != NULL)
    {
        retrievedName = [[NSString alloc] initWithFormat:@"%@", lastName];
    }

            [self dismissViewControllerAnimated:NO completion:^(){}];
}

答案 1 :(得分:2)

以下是Swift的一个例子:

拨打地址簿选择器:

@IBAction func didTouchAddContactButton(sender: AnyObject) {
    let contactPicker = ABPeoplePickerNavigationController()
    contactPicker.peoplePickerDelegate = self
    // Just to pick an email
    let properties: [AnyObject] = [Int(kABPersonEmailProperty)]
    contactPicker.displayedProperties = properties
    // Open picker
    presentViewController(contactPicker, animated: true, completion: nil)
}

从Person获取电子邮件:

extension ViewController: ABPeoplePickerNavigationControllerDelegate {
    func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {

        // Property
        let list: ABMultiValueRef = ABRecordCopyValue(person, property).takeRetainedValue() //kABPersonEmailProperty
        // Value index
        let index = Int(identifier) as CFIndex
        // Retrieve value
        let email: String = ABMultiValueCopyValueAtIndex(list, index).takeRetainedValue() as! String

        // Result
        print(email)

        peoplePicker.dismissViewControllerAnimated(true, completion: nil)
    }   
}

答案 2 :(得分:0)

我更新了我的代码。这是我更新的代码。它的工作100%完美。

 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
   ABMultiValueRef phone = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonPhoneProperty);
   CFStringRef phoneID = ABMultiValueCopyValueAtIndex(phone, 0);
   phoneNumberTextField.text = [NSString stringWithFormat:@"%@", phoneID];
   CFRelease(phoneID);
   CFRelease(phone);

   [self dismissViewControllerAnimated:YES completion:nil];

}

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
   return NO;
}

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

- (void)addContactFromPhoneContacts:(id)sender
{
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    [self presentViewController:picker animated:YES completion:nil];
}