5

我有一个子类ABPeoplePickerNavigationController来处理在我的应用程序中选择联系电话号码。在 iOS 7 及更低版本上一切正常。

然而,在 iOS 8 上,我ABPeoplePickerNavigationControllerDelegate在选择电话号码时不会被击中。相反,它只是拨打该电话号码。

我注意到我在 iOS 7 ( peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:) 中用于处理联系人选择的方法在 iOS 8 中已弃用。此方法已被peoplePickerNavigationController:didSelectPerson:property:identifier:.

我知道我的委托已设置,因为我成功接收到peoplePickerNavigationControllerDidCancel:方法回调。

有没有其他人遇到过这个问题?

这是我的子类的代码片段ABPeoplePickerNavigationController

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {

    [self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person property:property identifier:identifier];
}

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

    ...do stuff...

    return NO;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    return YES;
}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {

    [self dismissViewControllerAnimated:self.shouldAnimateDismiss completion:NULL];
}
4

4 回答 4

6

你在哪里指定peoplePickerDelegate

在 iOS 8 中,如果您在 中指定peoplePickerDelegateviewDidLoad您将体验到您描述的奇怪行为(取消委托工作,didSelect...并且shouldContinue...不工作)。如果您peoplePickerDelegate在之后init(或期间)立即指定,则可以正常工作。

这似乎是 iOS 8 的“功能”。我会提交错误报告。

于 2014-09-24T20:12:09.337 回答
2

以上两个委托方法在 ios 8.0 中已弃用,请使用最后两个方法来获得您想要的结果

以上两个委托方法在 iOS 8.0 中已被弃用,使用最后两种方法来获得你想要的结果

这是苹果开发者指南链接,为您提供有关的更多信息

ABPeoplePickerNavigationControllerDelegate

于 2014-12-03T10:22:18.240 回答
0

当我在 IOS8 中选择联系人时,什么都不会发生。

我发现除了

if ([picker respondsToSelector:@selector(setPredicateForSelectionOfPerson:)]) 
    {
         picker.predicateForSelectionOfPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count = 1"];
    }

我也需要

if ([picker respondsToSelector:@selector(setPredicateForEnablingPerson:)])
    {
        picker.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"];
    }

来源https://developer.apple.com/library/prerelease/ios/samplecode/PeoplePicker/Listings/PeoplePicker_AAPL_8or7_EmailPickerViewController_m.html

于 2014-12-17T13:28:59.407 回答
0

如果你只想得到人的名字,你可以这样做:

-(IBAction)btnGetContact{
    ABPeoplePickerNavigationController *personPicker = [ABPeoplePickerNavigationController new];
    personPicker.peoplePickerDelegate = self;
    [self presentViewController:personPicker animated:YES completion:nil];
}

-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
        NSString *firstName;
    NSString *middleName;
    NSString *lastName;
    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 personPicture
    if (person != nil && ABPersonHasImageData(person))
    {
        retrievedImage = [UIImage imageWithData:(__bridge_transfer NSData*)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)];
    }
    else
    {
        retrievedImage = nil;
    }
}

但是,如果您要查看人员的详细信息以获取人员的号码,则应BOOL改为使用voidforpeoplePickerNavigationController并传递YES如下:

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
    return YES;
}



 -(void) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
        ABMutableMultiValueRef phoneno  = ABRecordCopyValue(person, kABPersonPhoneProperty);

CFStringRef phone = ABMultiValueCopyValueAtIndex(phoneno, identifier);

        _mPhone.text = (__bridge NSString *)phone;

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

也不要忘记将AddressBook.frameworkand导入AddressBookUI.framework到您的项目ABPeoplePickerNavigationControllerDelegate中,

#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>

到你的头文件。

于 2015-07-14T06:11:55.467 回答