2010-02-24 7 views
11

Estoy casi desesperado porque busco una solución desde hace semanas.iPhone ABPeoplePickerNavigationController - Cómo seleccionar dos entradas individuales de dos propiedades multivalo diferentes de una persona de la libreta de direcciones

El problema es simple:

  • A través de la ABPeoplePickerNavigationController (como ModalView), una persona debe ser seleccionado.
  • Entonces solo (por ejemplo) las direcciones de Correo deben mostrarse y el usuario debe seleccionar una.
  • Después de seleccionar una dirección de correo, solo deben mostrarse los números de teléfono (por ejemplo) y el usuario debe seleccionar uno.

La solución hasta que el tercer aspecto es bien conocido:

- (IBAction)importFromAddressBook 
{ 
    ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init]; 
    picker.peoplePickerDelegate = self; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonEmailProperty]]]; 
    return YES; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 
    //===PROBLEM=== Now I do have a mail address and I want to have a phone number right afterwards. 

    //Something like this would be straightforward, but the view does not change this way: 
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]]; 
    //Here misses the important code. 


    //And only when I also got a phone number through this or a similar method I want to call: 
    [peoplePicker dismissModalViewControllerAnimated:YES]; 

    //I do not want to start default behaviour with the mailaddress and/or phone number: 
    return NO; 
} 

El enfoque correcto parece empujar un Peoplepicker similares Ver en el NavigationController del ModalView, pero no sé cómo.

¡Si alguien tuviera alguna idea, sería genial!

Si desea ver tal comportamiento en acción, puede echar un vistazo a la aplicación de Amazon: si sigue los primeros pasos de un pedido puede seleccionar una dirección de envío exactamente de esta manera: De la lista de contactos -> Seleccionar a Persona -> Seleccionar una dirección -> Seleccionar un número de teléfono. Allí, todo (parece) tener lugar en la vista modal con solo una jerarquía de navegación con un nivel más que en el código estándar que se muestra arriba.

Respuesta

1

En mi aplicación de iPhone Pastie, tomé un enfoque diferente. alt text http://manicwave.com/images/pastie/contactdetails.png

Utilizo PeoplePicker para seleccionar a la persona y luego abro un editor de contactos (persona).

Esto es sólo una visión simple:

contacto Nombre número de teléfono> defecto es el primer teléfono número dirección de correo electrónico> por defecto a la primera dirección de correo electrónico

Cada uno de número de teléfono y dirección de correo electrónico criar a otra vista mostrando la lista de teléfonos o direcciones de correo electrónico, con una marca de verificación al lado de la que está seleccionada actualmente.

Utilizo esta vista para la configuración inicial de un contacto y su posterior edición.

+0

¡Lo siento mucho, todavía no respondí! Su comentario me guió a la solución que era casi exactamente como la de zonble. ¡¡Muchas gracias!! –

15

supongo que esto podría ser lo que quiere:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 

    ABPersonViewController *controller = [[ABPersonViewController alloc] init]; 
    controller.displayedPerson = person; 
    controller.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]; 
    controller.personViewDelegate = self; 
    [peoplePicker pushViewController:controller animated:YES]; 
    [controller release]; 
    return NO; 
} 

- (BOOL)personViewController:(ABPersonViewController *)personViewController 
shouldPerformDefaultActionForPerson:(ABRecordRef)person 
        property:(ABPropertyID)property 
        identifier:(ABMultiValueIdentifier)identifierForValue 
{ 
    ABMutableMultiValueRef multi = ABRecordCopyValue(person, property); 
    CFStringRef phone = ABMultiValueCopyValueAtIndex(multi, identifierForValue); 
    NSLog(@"phone %@", (NSString *)phone); 
    CFRelease(phone); 

    ABPeoplePickerNavigationController *peoplePicker = (ABPeoplePickerNavigationController *)personViewController.navigationController; 
    [peoplePicker dismissModalViewControllerAnimated:YES]; 
    return NO; 
} 

La idea es, para crear otra instancia ABPersonViewController, y deje que su selector de personas para empujarlo, ya ABPeoplePickerNavigationController es una subclase de NSPeoplePickerNavigationController.

+0

Quiero pedirle disculpas también. No era mi intención no reaccionar. ¡Esto fue exactamente lo que busqué! –

+0

Hay un error en el código: NO debe usar el identificador como índice en la línea ABMultiValueCopyValueAtIndex (multi, identifierForValue). Convertir identiefier en un índice de propiedad a través de ABMultiValueGetIndexForIdentifier –

1

En la respuesta sugerida no es una novedad falta

CFRelease (multi);

Sin esta publicación, se producirá una fuga. O al menos de acuerdo con Build and Analyze en Xcode ...

1

El siguiente método debe devolver Nº:

- (BOOL)peoplePickerNavigationController: 
    (ABPeoplePickerNavigationController*)peoplePicker 
    shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    ... 
    return NO; 
} 

Esto permitirá que su próxima método se llama (peoplePickerNavigationController: shouldContinueAfterSelectingPerson: la propiedad: identificador :).

Cuestiones relacionadas