No se puede seleccionar el contacto en iOS 8

Tengo una subclass de ABPeoplePickerNavigationController para manejar la selección de un número de teléfono de contacto en mi aplicación. Todo funciona muy bien en iOS 7 y siguientes.

En iOS 8, sin embargo, mi ABPeoplePickerNavigationControllerDelegate no recibe un golpe cuando selecciona un número de teléfono. En cambio, solo llama a ese número de teléfono.

Noté que el método que estaba usando para manejar la selección de contactos en iOS 7 ( peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier: estaba en desuso en iOS 8. Este método fue reemplazado por peoplePickerNavigationController:didSelectPerson:property:identifier:

Sé que mi delegado está configurado porque recibo satisfactoriamente the peoplePickerNavigationControllerDidCancel: callback de método.

¿Alguien más ha tenido este problema?

Aquí hay un fragment de código de mi subclass 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]; } 

¿Dónde especificas a la peoplePickerDelegate ?

En iOS 8, si especifica peoplePickerDelegate en viewDidLoad , experimentará el comportamiento curioso que describe (cancelar delegado funciona, didSelect... y shouldContinue... do not). Si especifica peoplePickerDelegate inmediatamente después de init (o durante), funciona bien.

Esto parecería ser una function de iOS 8. Presentaré un informe de errores.

Más de dos métodos de delegado están en desuso en ios 8.0, usa los métodos de uso los dos últimos para obtener el resultado deseado

Más de dos methods de delegado están en desuso en iOS 8.0, utiliza los dos últimos methods para get el resultado deseado

este es el enlace de la guía de desarrollador de Apple que le brinda más información sobre

ABPeoplePickerNavigationControllerDelegate

Nada sucedería cuando seleccionaba un contacto en IOS8.

Encontré eso además de

 if ([picker respondsToSelector:@selector(setPnetworkingicateForSelectionOfPerson:)]) { picker.pnetworkingicateForSelectionOfPerson = [NSPnetworkingicate pnetworkingicateWithFormat:@"emailAddresses.@count = 1"]; } 

Yo también necesitaba

 if ([picker respondsToSelector:@selector(setPnetworkingicateForEnablingPerson:)]) { picker.pnetworkingicateForEnablingPerson = [NSPnetworkingicate pnetworkingicateWithFormat:@"emailAddresses.@count > 0"]; } 

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

Si quieres solo get el nombre de una persona, puedes hacer esto:

 -(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; } } 

Pero si está buscando ir a los detalles de las personas para get los numbers de las personas, debe usar BOOL lugar de void para el peoplePickerNavigationController de peoplePickerNavigationController de peoplePickerNavigationController y pasar YES como a continuación:

 -(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:^(){}]; } 

Además, no olvide importar AddressBook.framework y AddressBookUI.framework a su proyecto y ABPeoplePickerNavigationControllerDelegate ,

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

a su file de encabezado.