2010-02-24 8 views
11

Sono quasi disperato mentre cerco una soluzione da settimane.iPhone ABPeoplePickerNavigationController - Come selezionare due voci singole di due diverse proprietà multivalore di una persona dalla rubrica

Il problema è semplice:

  • Via del ABPeoplePickerNavigationController (come ModalView), una persona dovrebbe essere selezionato.
  • Quindi, solo (ad es.) Gli indirizzi di posta dovrebbero essere mostrati e l'utente dovrebbe selezionarne uno.
  • Dopo aver selezionato un indirizzo di posta elettronica, devono essere visualizzati solo i numeri di telefono (ad esempio) e l'utente deve selezionarne uno.

La soluzione fino a quando il terzo aspetto è ben noto:

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

L'approccio giusto sembra spingere un simile Peoplepicker Visualizza sulla navigationController del ModalView, ma io non so come.

Se qualcuno avesse qualche idea sarebbe bello!

Se si desidera vedere un simile comportamento in azione, è possibile dare un'occhiata all'app Amazon: se si eseguono i primi passaggi di un ordine, è possibile selezionare un indirizzo di spedizione in questo modo: Da Elenco contatti -> Seleziona una persona -> seleziona un indirizzo -> seleziona un numero di telefono. Lì, tutto (sembra) ha luogo nella vista modale con solo una gerarchia di navigazione con un livello in più rispetto al codice standard mostrato sopra.

risposta

1

Nella mia app per iPhone Pastie, ho adottato un approccio diverso. alt text http://manicwave.com/images/pastie/contactdetails.png

Io uso PeoplePicker per selezionare la persona e quindi aprire un editor di contatti (persona).

Questa è solo una visione semplice:

contatto Nome numero di telefono> default è il primo telefono il numero e-mail Indirizzo> default primo indirizzo e-mail

Ognuno di numero di telefono e indirizzo e-mail far apparire un'altra vista mostrando l'elenco di telefoni o indirizzi e-mail, con un segno di spunta accanto a quello attualmente selezionato.

Uso questa visualizzazione per l'impostazione iniziale di un contatto e la successiva modifica.

+0

Mi dispiace, ma non ho ancora risposto! Il tuo commento mi ha guidato alla soluzione che era quasi esattamente come quella di zonble. Grazie mille!! –

15

Credo che questo potrebbe essere ciò che si desidera:

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

L'idea è, per creare un'altra istanza ABPersonViewController, e lasciate che il vostro popolo selettore per spingerlo, dal momento che ABPeoplePickerNavigationController è una sottoclasse di NSPeoplePickerNavigationController.

+0

Voglio scusarmi anche a te. Non era mia intenzione non reagire. Questo era esattamente quello che cercavo! –

+0

C'è un errore nel codice - NON si deve usare l'identificatore come indice nella riga ABMultiValueCopyValueAtIndex (multi, identifierForValue). Converti identiefier in un indice di proprietà tramite ABMultiValueGetIndexForIdentifier –

1

Nella risposta suggerita v'è un rilascio manca

CFRelease (multi);

Senza questo rilascio si verificherà una perdita. O almeno secondo Build and Analyze in Xcode ....

1

Il seguente metodo deve restituire NO:

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

Questo permetterà al prossimo metodo di essere chiamato (peoplePickerNavigationController: shouldContinueAfterSelectingPerson: codice: identificativo :).

Problemi correlati