2009-06-04 12 views
1

Je présente un ABPeoplePickerNavigationController à l'utilisateur et lui demande de sélectionner un contact. Une fois qu'ils ont sélectionné un utilisateur, je souhaite qu'ils soient envoyés à l'application Messages ou à l'application E-mail en fonction de la propriété qu'ils ont sélectionnée. Cependant, je ne peux pas comprendre comment personnaliser l'action qui se produit après le sélecteur modal est rejeté.Action personnalisée après le rejet de ABPeoplePickerNavigationController

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { 
    if(property == kABPersonPhoneProperty){ 
     [self dismissModalViewControllerAnimated:YES]; 
     NSString* phoneNumber = (NSString *)ABRecordCopyValue(person, property); 
     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"sms:%@", phoneNumber]]; 
     [[UIApplication sharedApplication] openURL:url]; 
     [phoneNumber release]; 
     return NO; 
    } 

    if(property == kABPersonEmailProperty){ 
     [self dismissModalViewControllerAnimated:YES]; 
     NSString* emailAddress = (NSString *)ABRecordCopyValue(person, property); 
     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"mailto:%@", emailAddress]]; 
     [[UIApplication sharedApplication] openURL:url]; 
     [emailAddress release]; 
     return NO; 
    } 
    return YES; 
} 

Alors, comment faire? Merci!

Répondre

0

Résolu. Le problème n'était pas avec les méthodes de délégué. C'est que le NSURL que je crée est invalide. Pour lancer l'application SMS/Messaging avec le numéro de téléphone sélectionné, l'utilisateur sms: // ... le // est la clé! Les documents semblent indiquer sms: comme le format correct, mais j'ai trouvé que c'est incorrect.

0

Vous pouvez créer un protocole personnalisé avec deux méthodes (par exemple, pickedPhone et pickedMail) et demander à la classe appelant celle-ci d'implémenter ces routines et de s'attribuer en tant que délégué. Une fois la décision prise, vous vérifiez si le délégué est défini, puis invoquez la bonne méthode et laissez l'appelant gérer ce qu'il doit faire.

De même, vous devriez faire quelques tests sur l'URL "sms". Dernière fois que j'ai vérifié, il exécute l'application SMS, mais ne lui passe rien. Mais avant même d'y arriver, comme vous l'avez fait en appelant ces openURL pour appeler des applications de téléphone ou de messagerie externes, votre application sera arrêtée et le contrôle sera transféré vers ces applications. Donc, je ne suis pas sûr de savoir pourquoi vous vous souciez de ce qui se passe après que l'utilisateur a rejeté le sélecteur modal parce que votre application ne sera plus là.

Maintenant sous OS 3.0, vous avez peut-être quelques options, mais quand même ... vous voudrez peut-être reconsidérer le problème.

+0

Je suis conscient que mon application va perdre le contrôle. J'essaie d'intercepter la sélection de propriétés afin de personnaliser le courrier électronique qui s'ouvre. Je peux définir le sujet/corps pour l'utilisateur par commodité.En outre, s'ils sélectionnent un numéro de téléphone, je souhaite que l'application SMS apparaisse, et non l'application Téléphone. Ainsi, j'ai besoin de l'intercepter puis d'appeler l'openURL approprié. – Georges

2

Il vous suffit de mettre en œuvre la méthode déléguée

- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue 

Dans la mise en œuvre revenir simplement OUI (à moins que vous devez traiter la propriété sélectionnée). Ensuite, si l'utilisateur a touché un numéro de téléphone, votre application commencera à appeler ce numéro de téléphone. De même, si l'utilisateur a contacté une adresse e-mail, l'application yout passera à l'affichage par e-mail de composition par défaut.

N'oubliez pas de vous désigner comme délégué, sinon le mthod ne sera pas appelé:

ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init]; 
peoplePicker.peoplePickerDelegate = self; 
[self presentModalViewController:peoplePicker animated:YES]; 

Et enfin, mettre ABPeoplePickerNavigationControllerDelegate dans la section de protocole du fichier d'en-tête de votre contrôleur. REMARQUE: vous devriez tester ceci sur l'appareil, pas sur le simulateur.

+0

Merci pour la réponse. Je suis un peu confus, cependant, parce que la méthode que vous avez suggéré que j'implémente est dans le protocole ABPersonViewControllerDelegate, pas le protocole PeoplePicker. J'ai défini mon contrôleur en tant que délégué pour ABPeoplePickerNavigationController et ces méthodes sont appelées correctement, mais la méthode de délégué ABPersonViewController n'est jamais appelée. Je suppose que c'est parce que je n'ai pas défini mon contrôleur en tant que délégué pour les ABPersonViewControllers qui sont instanciés par le ABPeoplePickerNavigationController. Savez-vous comment configurer cela? – Georges

+0

Une fois que l'utilisateur sélectionne un contact, il suffit d'initialiser/allouer un ABPersonViewController pour définir son délégué et la personne à afficher (le contact sélectionné par votre utilisateur), puis le pousser sur la pile. Ensuite, en cliquant sur un numéro de téléphone ou une adresse e-mail, l'action par défaut sera déclenchée. –

0

juste retour NO/FAUX/false dans

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

et écrire du code dans la même fonction pour le traitement de contact