无法在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中被弃用,使用最后两个方法来获得你想要的结果
这是苹果开发者指南链接给你更多的信息
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"]; }
如果你想得到人的名字,你可以这样做:
-(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.framework
和AddressBookUI.framework
到您的项目和ABPeoplePickerNavigationControllerDelegate
,
#import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h>
到你的头文件。