ABPeoplePickerNavigationController

NigokiNigoki Membre
19:22 modifié dans API UIKit #1
Hello  <3 <br />
J'aimerai importer des personnes du répertoire interne de l'iphone à  mon application.

En suivant la doc ici j'utilise donc ABPeoplePickerNavigationController que j'affiche comme inscrit dans la doc en modal :

<br />ABPeoplePickerNavigationController *vCtrl = [[ABPeoplePickerNavigationController alloc] init];<br />		[self.navigationController presentModalViewController:vCtrl animated:YES];<br />		[vCtrl release];<br />


sans oublier le delegate :

<br />@interface AddContactView : UITableViewController &lt;ABPeoplePickerNavigationControllerDelegate&gt;<br />


Alors la modal s'affiche sans problème par contre il ne semble pas que mes fonctions du delegate ne s'execute. J'avoue ne pas trop savoir comme cela fonctionne.
Dans mon .m et .h j'ai implémenté les fonctions delegate et il ne semble pas que ce soit suffisant.

Par exemple :

<br />- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {<br /><br />	[self.navigationController dismissModalViewControllerAnimated:YES];<br />	<br />}<br />


Qui est sensé etre appellé quand on fait Annuler sur la modale et qui donc supprime ma vue n'est jamais appellé. (testé simplement avec NSLog)

Donc question, comment s'implemente ce genre de fonctions qui viennent d'un delegate ?  :why?:

Réponses

  • 19:22 modifié #2
    Tu as simplement oublié setDelegate...

    juste après le alloc +init de ton  "vCtrl", tu rajoutes [vCtrl setDelegate:self];
  • NigokiNigoki Membre
    19:22 modifié #3
    Merci pour cette réponse rapide. Cependant, j'ai un warning si je procède comme cela :

    <br />ABPeoplePickerNavigationController *vCtrl = [[ABPeoplePickerNavigationController alloc] init];<br />		[vCtrl setDelegate:self];<br />
    

    <br />warning class: AddContactView does not implement the &#39;UINavigationControllerDelegate&#39; protocol<br />
    


    J'ai essayé au cas ou :
    <br />[vCtrl setDelegate:self.navigationController];<br />
    

    en vain.

    Il faut que j'ajoute un deuxieme delegate ? est-ce possible ?
  • AliGatorAliGator Membre, Modérateur
    mai 2009 modifié #4
    Il faut déclarer que l'objet dont tu te sers en tant que delegate répond bien au protocole UINavigationControllerDelegate, en mettant le nom du protocole entre chevrons <> dans ton .h après le nom de la classe parente (cf la documentation Apple sur les protocoles).
    Et bien sûr implémenter les méthodes (au moins les requises, celles non marquées comme optionnelles) de ce protocole.

    Pour plus d'infos :
    - La doc sur le principe des protocoles en Objective-C (en particulier la section adopting a protocol)
    Tu as aussi de la doc sur les design patterns "delegate" dans la doc Apple
  • 19:22 modifié #5
    Faut que tu rajoutes "UINavigationControllerDelegate" dans ton header :
    <br />@interface AddContactView : UITableViewController &lt;ABPeoplePickerNavigationControllerDelegate, UINavigationControllerDelegate&gt;<br />
    

    Par contre j'ai jamais utilisé donc je sais pas pourquoi il te demande "UINavigationControllerDelegate" avec "ABPeoplePickerNavigationControllerDelegate"
  • NigokiNigoki Membre
    19:22 modifié #6
    Merci de votre aide 

    J'ai continué de chercher dans  la direction que vous m'aviez donné car le setDelegate n'était apperemment pas suffisant et voici la réponse :

    <br />ABPeoplePickerNavigationController *vCtrl = [[ABPeoplePickerNavigationController alloc] init];<br />		vCtrl.peoplePickerDelegate = self;<br />		[self.navigationController presentModalViewController:vCtrl animated:YES];<br />		[vCtrl release];<br />
    


    et avec ça les méthodes delegate sont bien appellée.  :p
Connectez-vous ou Inscrivez-vous pour répondre.