[Résolu]Comment appeler une méthode de NSWindowController depuis un MYTextField

mybofymybofy Membre
mars 2014 modifié dans API AppKit #1

Bonjour


 


Un NSWindowController ajoute une NSOutlineView dans la contentView de la fenêtre qu'il contrôle.


La NSOutlineView est view based. Le NSTextField de la NSOutlineView est sous-classé en MYTextField pour récupérer un mouseDown.


La méthode mouseDown doit appeler une méthode du NSWindowController.


 


J'ai trouvé une solution :



- (void)mouseDown:(NSEvent *)theEvent {
[[[[[[[[[[self superview] superview] superview] superview] superview] superview] superview] window] windowController] planteSelected:plante];
}

ça marche parfaitement, mais je suis obligé de déclarer la méthode "planteSelected:plante" dans un "Protocols.h", sinon ça plante.


L'appel à  un "Protocols.h" me gène passablement, car il y a un parfum de redondance...


 


Existe-t-il une meilleure façon de procéder ?


Réponses

  • MalaMala Membre, Modérateur

    Déjà ...


    [myView window];

     


    ;)


  • MalaMala Membre, Modérateur
    mars 2014 modifié #3

    Après, tu peux utiliser un delegate assigné à  ta vue et ton contrôleur se déclare en tant que tel en respectant un protocole.


     


    Autre solution, ta vue poste des notifications et ton controller est à  l'écoute.


  • zoczoc Membre


    L'appel à  un "Protocols.h" me gène passablement, car il y a un parfum de redondance...


     




     


    Cette solution est justement la meilleure car elle permet d'interfacer le NSTextField custom à  n'importe quel autre objet implémentant le protocol. Elle permet un couplage faible entre les objets et c'est toujours bénéfique sur la durée.


     


    L'autre solution couple fortement MYTextField avec le NSWindowController ou dérivé. Et c'est pas génial pour la réutilisabilité.


     


    Les @protocols c'est bon. On n'en n'abuse jamais assez.

  • Bien. Je suis rassuré.


     


    Donc je peux continuer sur ma lancée.


     


    Merci à  tous.


Connectez-vous ou Inscrivez-vous pour répondre.