(target,action) des MSMenuitem dans une Cocoa Document-Based Application
Philippe49
Membre
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 :
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
Oh que si !! c'est exactement ce que je cherchais.
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.
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]
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.
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.
.
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 ...