robado reportar por perdido modo desde desactivar buscar bloquear iphone ios addressbook

iphone - reportar - ¿Cómo utilizar correctamente ABPersonViewController con ABPeoplePickerNavigationController para ver la información de contacto?



desactivar modo perdido iphone (1)

Solo un aviso para cualquier persona que se encuentre con este problema: pude producir el comportamiento correcto al crear una instancia del ABPersonViewController en el método viewDidLoad () de su delegado como se muestra a continuación:

Como antes, aquí está el método de mi delegado ABPeoplePickerNavigationController :

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { BOOL returnState = NO; PersonViewController *personView = [[PersonViewController alloc] init]; [peoplePicker pushViewController:personView animated:YES]; [personView displayContactInfo:person]; [personView release]; return returnState; }

Aquí está mi archivo de cabecera PersonViewController.h (delegado ABPersonViewController):

#import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <AddressBookUI/AddressBookUI.h> @interface PersonViewController : UIViewController <ABPersonViewControllerDelegate> { ABPersonViewController *personController; } - (void) displayContactInfo: (ABRecordRef)person; @end

Finalmente, aquí está la implementación del delegado (PersonViewController.m):

#import "PersonViewController.h" @implementation PersonViewController - (void) viewDidLoad { } - (void) viewDidUnload { [personController release]; } - (void) displayContactInfo: (ABRecordRef)person { personController = [[ABPersonViewController alloc] init]; [personController setDisplayedPerson:person]; [personController setPersonViewDelegate:self]; [personController setAllowsEditing:NO]; personController.addressBook = ABAddressBookCreate(); personController.displayedProperties = [NSArray arrayWithObjects: [NSNumber numberWithInt:kABPersonPhoneProperty], nil]; [self setView:personController.view]; } - (BOOL) personViewController:(ABPersonViewController*)personView shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue { // This is where you pass the selected contact property elsewhere in your program [[self navigationController] dismissModalViewControllerAnimated:YES]; return NO; } @end

Esperemos que esto termine siendo útil para alguien. El marco de la interfaz de usuario de la libreta de direcciones fue un poco complicado para mí (aunque soy nuevo en el desarrollo de iPhone, todavía estoy aprendiendo muchos de los matices de la organización del programa de iPhone).

Actualización 9/2/10: este código ya no funciona a partir de la actualización de iOS 4: falla con una afirmación interna. Ahora hay un excelente ejemplo de API de la Libreta de direcciones disponible en la biblioteca de referencia de SDK de iPhone llamada "Contactos rápidos".

El código de ejemplo está disponible aquí; le ayudará a resolver este problema: http://developer.apple.com/iphone/library/samplecode/QuickContacts/Introduction/Intro.html

Estoy intentando agregar una función a mi aplicación que le permite al usuario seleccionar un contacto de un ABPeoplePickerNavigationController , que luego muestra un ABPersonViewController correspondiente al contacto que eligieron. En ese momento, quiero que el usuario pueda hacer clic en el número de teléfono de un contacto y que mi aplicación responda con un comportamiento personalizado.

Tengo el ABPeoplePickerNavigationController funcionando bien, pero tengo un problema con la visualización del ABPersonViewController . Puedo hacer que el ABPersonViewController se anime en la pantalla sin problemas, pero solo muestra la foto, el nombre y el nombre de la empresa del contacto. Ninguno de los otros campos del contacto se muestran.

Estoy usando el elemento '' shownProperties '' en ABPersonViewController para decirle al programa que muestre los números de teléfono. Esto crea un comportamiento extraño; cuando selecciono un contacto que no tiene números de teléfono asignados, el contacto aparece con "Sin números de teléfono" escrito en segundo plano (como es de esperar), pero al seleccionar un contacto que tiene un número de teléfono, todo lo que recibo es una página de contacto en blanco (sin el texto "Sin números de teléfono").

Aquí está el método en mi clase de delegado ABPeoplePickerNavigationController que estoy usando para crear mi clase PersonViewController , que implementa la interfaz ABPersonViewController:

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { BOOL returnState = NO; PersonViewController *personView = [[PersonViewController alloc] init]; [personView displayContactInfo:person]; [peoplePicker pushViewController:personView animated:YES]; [personView release]; return returnState; }

Aquí está mi archivo de cabecera PersonViewController.h :

#import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <AddressBookUI/AddressBookUI.h> @interface PersonViewController : UIViewController <ABPersonViewControllerDelegate> { } - (void) displayContactInfo: (ABRecordRef)person; @end

Finalmente, aquí está mi PersonViewController.m que está creando ABPersonViewController para ver el contacto seleccionado:

#import "PersonViewController.h" @implementation PersonViewController - (void) displayContactInfo: (ABRecordRef)person { ABPersonViewController *personController = [[ABPersonViewController alloc] init]; personController.personViewDelegate = self; personController.allowsEditing = NO; personController.displayedPerson = person; personController.addressBook = ABAddressBookCreate(); personController.displayedProperties = [NSArray arrayWithObjects: [NSNumber numberWithInt:kABPersonPhoneProperty], nil]; [self setView:personController.view]; [[self navigationController] pushViewController:personController animated:YES]; [personController release]; } - (BOOL) personViewController:(ABPersonViewController*)personView shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue { return YES; } @end

¿Alguien tiene alguna idea de por qué veo esta pantalla de contacto en blanco en lugar de una con campos de número de teléfono seleccionables?

Muy bien, creo que me estoy acercando a encontrar el problema. Estoy bastante seguro de que es con esta parte de la llamada de displayContactInfo arriba:

[self setView:personController.view];

Cuando omito esta línea, todo lo que veo es una pantalla en blanco cuando hago clic en un contacto. El ABPeoplePickerNavigationController está empujando el PersonViewController en la pila de NavigationController. El PersonViewController crea una instancia de un objeto ABPersonViewController, pero por alguna razón, el ABPersonViewController nunca se agrega correctamente a la pila de NavigationController.

¿Alguien sabe cómo agregar el ABPersonViewController a la pila, en lugar de solo el PersonViewController?