cómo - ios 8 para iphone 4 descargar
Cambios de ABPeoplePickerNavigationController con iOS8? (3)
Desde que actualicé XCode (6.0, 6A313) y mi iOS (8.0, 12A365) en el iPhone a gm seeds, el código ABPeoplePickerNavigationController no funciona como antes.
iOS 7.1.2: si alguien quiere importar un contacto, se abrirá la libreta de direcciones y verá la lista completa de contactos, después de elegir uno, abrirá la vista de detalle de un contacto y podrá agregar el contacto con un clic del teléfono. número que desea importar.
iOS 8.0: todo es similar, pero si hace clic en el número de un contacto, marque el número de teléfono en lugar de importarlo.
Código:
#pragma mark - AddressBook Delegate Methods
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
return YES;
}
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
// Get the first and the last name. Actually, copy their values using the person object and the appropriate
// properties into two string variables equivalently.
// Watch out the ABRecordCopyValue method below. Also, notice that we cast to NSString *.
NSString *firstName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *lastName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
// Compose the full name.
NSString *fullName = @"";
// Before adding the first and the last name in the fullName string make sure that these values are filled in.
if (firstName != nil) {
fullName = [fullName stringByAppendingString:firstName];
}
if (lastName != nil) {
fullName = [fullName stringByAppendingString:@" "];
fullName = [fullName stringByAppendingString:lastName];
}
// Get the multivalue number property.
CFTypeRef multivalue = ABRecordCopyValue(person, property);
// Get the index of the selected number. Remember that the number multi-value property is being returned as an array.
CFIndex index = ABMultiValueGetIndexForIdentifier(multivalue, identifier);
// Copy the number value into a string.
NSString *number = (__bridge NSString *)ABMultiValueCopyValueAtIndex(multivalue, index);
nameTextField.text = fullName;
numberTextField.text = number;
// Dismiss the contacts view controller.
[_addressBookController dismissViewControllerAnimated:YES completion:nil];
return NO;
}
// Implement this delegate method to make the Cancel button of the Address Book working.
-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
[_addressBookController dismissViewControllerAnimated:YES completion:nil];
}
No se pudo encontrar ninguna respuesta en la biblioteca de desarrolladores iOS de Apple. ¿Tiene alguien más una solución para ello?
Esto me funcionó tanto en iOS 8 como en iOS 7 y más bajo.
Tenga en cuenta que estoy usando esta persona didSelectPerson: (ABRecordRef) en su lugar.
//Needed for iOS 8
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
NSLog(@"Went here 1 ...");
[self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person];
}
//needed for iOS 7 and lower
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
NSLog(@"Went here 2 ...");
//add your logic here
}
Vea también el método delegado, nuevo con iOS8:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person;
{
[self selectedPerson:person];
}
Eso es lo que quería en mi caso.
iOS 8 requiere que se implemente un nuevo método de delegado para esto:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
}
Mantenga el antiguo método de delegado en su lugar para soportar iOS 7 o anterior. Lo que hago en mi aplicación es llamar al método delegado de iOS 7 desde el método delegado de iOS 8:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
[self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person property:property identifier:identifier];
}
Si este método de delegado no se implementa en iOS 8, tocar el valor provoca la acción. Cuando se implementa, se llama al delegado en su lugar con el valor seleccionado.