无法在iOS 8上select联系人

我有一个ABPeoplePickerNavigationController的子类来处理在我的应用程序中select一个联系电话号码。 一切工作在iOS 7及以下的伟大。

但是,在iOS 8上,我的ABPeoplePickerNavigationControllerDelegate在select电话号码时不会被打中。 相反,它只是拨打那个电话号码。

我注意到,我用来处理iOS 7中的联系人select的方法( peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:在iOS 8中已被弃用。此方法已被peoplePickerNavigationController:didSelectPerson:property:identifier:取代。

我知道我的委托设置,因为我成功地接收peoplePickerNavigationControllerDidCancel:方法callback。

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

以下是我的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]; } 

你在哪里指定peoplePickerDelegate

在iOS 8中,如果您在viewDidLoad指定了peoplePickerDelegate ,您将会体验到您所描述的奇怪行为(取消委托作品, didSelect...shouldContinue...不)。 如果在init (或在)之后立即指定peoplePickerDelegate ,则它工作正常。

这似乎是一个iOS 8的“function”。 我将提交一个错误报告。

上面两个委托方法在ios 8.0中不推荐使用,最后两个使用方法来获得你想要的结果

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

这是苹果开发者指南链接给你更多的信息

ABPeoplePickerNavigationControllerDelegate

当我在IOS8中select一个联系人时,什么都不会发生。

我发现除了

 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

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

 -(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而不是peoplePickerNavigationController而通过如下所示的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.frameworkAddressBookUI.framework到您的项目和ABPeoplePickerNavigationControllerDelegate

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

到你的头文件。