[BWToolkit] toggleCollapse: par le code

FloFlo Membre
09:19 modifié dans API AppKit #1
Bonjour à  tous,

dans BWToolkit il y a une NSSplitView spécialisée qui s'appelle BWSplitView. L'interface contient une méthode (IBAction) toggleCollapse: (id)sender qui permet de "collapser" une des vues.

J'ai essayé d'appeler cette méthode par le code (self corresponds à  l'appDelegate) :
<br />[self.leftSplitView toggleCollapse: self];<br />


Et la boom, le framework essaye de m'appeler les méthodes (NSCell *) cell et (void) setState: (NSInteger)value sur mon appDelegate.
Je me suis dit, oula mais il est en train de prendre mon appDelegate pour un bouton là   ???

Je suis allé voir un peu le code de la méthode toggleCollapse: du framework et effectivement il y a un truc du style :
<br />// Get a reference to the button and modify its behavior<br /> (IBAction)toggleCollapse:(id)sender<br />{<br />&nbsp; &nbsp; &nbsp; &nbsp; ...<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; if ([self toggleCollapseButton] == nil)<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self setToggleCollapseButton:sender];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[toggleCollapseButton cell] setHighlightsBy:NSPushInCellMask];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[toggleCollapseButton cell] setShowsStateBy:NSContentsCellMask];<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; ....<br />}<br />


J'imagine que c'est pour modifier l'apparence du bouton sensé avoir déclenché l'appelle du collapse en fonction de l'état de la vue.
Du coup j'ai implémenté les méthodes (NSCell *) cel et (void) setState: (NSInteger)value dans mon appDelegate qui renvoie nil et ne font rien.

ça marche mais je trouve ça un petit peu crade quand même... Est-ce que quelqu'un a déjà  été confronté à  ce problème et aurait trouvé une solution plus élégante ?

Merci d'avance  :D

Réponses

  • AliGatorAliGator Membre, Modérateur
    09:19 modifié #2
    Et si, quand tu appelles ta méthode par le code, tu mets "nil" comme sender, et pas "self" = ton appdelegate ?
  • FloFlo Membre
    09:19 modifié #3
    Ho punaise quel boulet, comment j'ai pu ne pas penser à  ça ?!  ::)
    Merci Ali  ;)
  • AliGatorAliGator Membre, Modérateur
    09:19 modifié #4
    Bon après c'est un peu de la faute de BWToolkit (bon c'est pas méchant hein) : on prend facilement l'habitude de mettre le type "id" pour les sender des IBActions, mais pour ma part plus ça va plus si j'ai une contrainte sur le sender, je le spécifie dans le type. Comme ça si je m'attends à  ce que le sender soit un UIButton je ne risques pas de connecter l'IBAction à  autre chose qu'un UIButton dans IB, et si je veux l'appeler par code je sais qu'il ne faut pas que je passe un objet du genre AppDelegate, mais soit un UIButton soit... nil
    Donc pour bien faire ils auraient dû indiquer le bon type pour ce paramètre sender (oui oui on n'est pas obligé de mettre "id" loin de là , si on met un type spécifique ça limitera juste l'IBAction à  n'être connectée dans IB qu'aux types d'objets correspondants), mais bon, d'un autre côté à  part dans mes rares projets où le sender était d'un type imposé, j'ai rarement vu des IBAction qui précisaient autre chose que id :P (Ou si on laisse ID il faut vérifier le type avant de tenter un appel de message dessus)
Connectez-vous ou Inscrivez-vous pour répondre.