(target,action) des MSMenuitem dans une Cocoa Document-Based Application

Philippe49Philippe49 Membre
août 2007 modifié dans API AppKit #1
Bonjour

Je veux rajouter des item perso du main menu dans une Cocoa Document-Based Application. Il y a de multiples façons pour en définir la cible (target) et l'action.
Mais comme un automatisme est prévu, et fonctionne via le firstResponder, le plus simple est de l'utiliser.

J'ai trouvé comme solution de définir par le code avec :
[menuItem setAction:@selector(moveDown:)];
après avoir repéré le menuItem dans le mainMenu

Mais cela fait beaucoup de code, et je me demande si il n'est pas inutile   ???  ???
Avez vous mieux ?


// Après discussion, cela est affiné plus bas
D'après Garfinkel (Cocoa Applications, O'Reilly) quand un message est envoyé au firstResponder, il est exécuté par le premier des objets suivants :
  • la "key window"
  • le délégué de la "key window"
  • la "main window"
  • le délégué de la "main window"
  • l'instance de NSApplication
  • le délégué de l'instance de NSApplication

Réponses

  • schlumschlum Membre
    21:58 modifié #2
    Pas sûr de comprendre la question... Mais on peut ajouter des actions au FirstResponder dans Interface Builder et y connecter des sous-menus (par exemples), ce qui rend le code "setAction" inutile.

    Il suffit de sélectionner l'"objet" FirstResponder dans l'onglet "Classes" (juste sous NSObject) et d'ajouter "Actions" comme pour n'importe quel autre objet.
  • Philippe49Philippe49 Membre
    21:58 modifié #3
    dans 1186270087:

    Pas sûr de comprendre la question ...

    Oh que si !! c'est exactement ce que je cherchais.

    dans 1186270087:

    Mais on peut ajouter des actions au FirstResponder dans Interface Builder

    Je n'avais pas imaginé cela possible : FirstResponder n'est pas une classe, il me semble.
    Mais encore une fois, on peut admirer le bon sens de la conception d'IB .
     
  • fouffouf Membre
    21:58 modifié #4
    dans 1186300958:

    Je n'avais pas imaginé cela possible : FirstResponder n'est pas une classe, il me semble.
    Mais encore une fois, on peut admirer le bon sens de la conception d'IB .

    Non, ce n'est pas une classe, c'est ... rien.
    Quand tu vas connecter l'action d'un menu (ou d'un bouton) à  FirstResponder et que ce menu est choisi, l'application va parcourir la responder chain jusqu'à  trouver un objet qui réponde à  cette action. Pour plus d'info sur la responder chain, je te laisse regarder ca.
    Enfin, il ne faut pas oublier un truc : FirstResponder dans IB c'est rien (nil) car tous les messages sont envoyés grace à  la méthode - (BOOL)sendAction:(SEL)anAction to:(id)aTarget from:(id)sender avec nil pour l'argument aTarget afin de faire appel à  la responder chain.
  • Philippe49Philippe49 Membre
    août 2007 modifié #5
    dans 1186303707:

    je te laisse regarder ca.


    Bingo, cela répond à  la deuxième partie de ma question !! 

    un extrait:
    For document-based applications, the default responder chain for the main window consists of the following responders and delegates:

    The main window's first responder and the successive responder objects up the view hierarchy
    The main window itself
    The main window's delegate.
    The window's NSWindowController object (which inherits from NSResponder)
    The NSDocument object (if different from the main window's delegate)
    The application object, NSApp
    The application object's delegate
    The application's document controller (an NSDocumentController object, which does not inherit from NSResponder)


    Figure 1-10 shows the responder chain of a document-based application.

    Figure 1-10  Responder chain of a document-based application



    [Fichier joint supprimé par l'administrateur]
  • Philippe49Philippe49 Membre
    août 2007 modifié #6
    dans 1186303707:

    Enfin, il ne faut pas oublier un truc : FirstResponder dans IB c'est rien (nil) car tous les messages sont envoyés grace à  la méthode - (BOOL)sendAction:(SEL)anAction to:(id)aTarget from:(id)sender avec nil pour l'argument aTarget afin de faire appel à  la responder chain.


    Ce qui veut dire que si dans son code on veut envoyer un message à  la chaà®ne du first responder, on peut faire de même :
    [NSApp sendAction:@selector(myAction:)  to:nil  from:mySender]
    ... à  retenir.
  • schlumschlum Membre
    21:58 modifié #7
    dans 1186300958:

    Je n'avais pas imaginé cela possible : FirstResponder n'est pas une classe, il me semble.
    Mais encore une fois, on peut admirer le bon sens de la conception d'IB .
     


    Pour ça que j'ai mis "objet" entre guillemets  :P
    On peut l'atteindre aussi en double-cliquant sur l'"instance" (qui encore une fois n'est pas une instance, mais est présenté comme telle) "FirstResponder" !
  • BruBru Membre
    21:58 modifié #8
    dans 1186305780:

    dans 1186300958:

    Je n'avais pas imaginé cela possible : FirstResponder n'est pas une classe, il me semble.
    Mais encore une fois, on peut admirer le bon sens de la conception d'IB .
     


    Pour ça que j'ai mis "objet" entre guillemets  :P
    On peut l'atteindre aussi en double-cliquant sur l'"instance" (qui encore une fois n'est pas une instance, mais est présenté comme telle) "FirstResponder" !


    Si si, "First Responder" dans IB, c'est bien un objet (ou une instance de classe).
    Mais, comme tous les autres éléments grisés (par exemple File's Owner), ce sont des objets qui n'appartiennent pas (qui ne sont pas stockés dans) au nib.
    Il s'agit d'une sorte "d'outlet" de certains objets extérieurs au nib mais que celui-ci peut utiliser.

    .
  • Philippe49Philippe49 Membre
    21:58 modifié #9
    dans 1186310167:

    Si si, "First Responder" dans IB, c'est bien un objet (ou une instance de classe).
    Mais, comme tous les autres éléments grisés (par exemple File's Owner), ce sont des objets qui n'appartiennent pas (qui ne sont pas stockés dans) au nib.
    Il s'agit d'une sorte "d'outlet" de certains objets extérieurs au nib mais que celui-ci peut utiliser.

    On peut imaginer que pour mettre en place un tel fonctionnement, NSApp tienne à  jour une liste chaà®née (de delegate), dont FirstResPonder représenterait la racine ...
Connectez-vous ou Inscrivez-vous pour répondre.