Relier un élément de menu à une action de document
J'ai une application qui est document-based.
Je souhaite créer une entrée dans le menu qui lance une action relative au document, et non relative à l'application.
Quand j'ouvre MainMenu.xib, j'ai les bons outils en main pour linker des entrées de menu avec des actions liées à mon application : par exemple, le MainMen.xib est le bon endroit où mettre mon AppDelegate, où je peux ensuite définir mes actions dont le scope est l'application.
Comment faire pour linker un élément de menu à une action dont le scope est le document ?
Voilà comment j'ai fait. Je voulais savoir s'il y a mieux.
-> je linke mon entrée de menu avec une action doAction de mon appDelegate.
-> dans le corps de cette méthode doAction, je récupère le document en cours, à l'aide de
MyDocument * myDoc = [[NSDocumentController sharedDocumentController] currentDocument];
-> Je lance une action : [myDoc doRealAction].
Une des mes craintes est l'emploi de [[NSDocumentController sharedDocumentController] currentDocument]. J'ai lu qu'il ne marche pas toujours (cf. http://stackoverflow.com/questions/8912314/nsdocumentcontroller-currentdocument-returning-nil)
Merci
Réponses
Ca se passe dans first responder dans xcode:
http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Conceptual/Xcode_User_Guide/030-Edit_User_Interfaces/edit_user_interface.html
Pour envoyer une message au first responder par code, il faut utiliser sendAction:to:from: de NSApplication
ex:
Merci !
J'ai cependant un problème : quand je veux faire un binding sur un tel élément de menu (en l'occurrence pour le caractère enabled ou pas), je n'ai pas accès dans la liste proposée au First Reponder.
J'imagine que c'est un cas courant, pourtant...
Bonjour,
Il faudra en passer par là :
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Protocols/NSMenuValidation_Protocol/Reference/Reference.html
Quand les bindings vous lâchent, il reste les notifications...
Pas si certain que toi puisque sera firstResponder le premier NSResponder dans la chaà®ne des répondeurs donc n'importe quel objet Vue->SuperVue->Fenêtre->Contrôleur de fenêtre->Document->Contrôleur de document->Application.
Et ça changera selon l'élément sélectionné par l'utilisateur. Difficile dans ces conditions de faire un binding et encore plus de le garder à jour !
Pour le côté enabled il suffit d'ajouter ta méthode à l'objet firstResponder de ton nib comme te l'a indiqué mpergand puis de control-clic tirer l'action de ton menu sur cet objet FirstResponder du nib et pas sur une méthode de AppDelegate.
Ensuite si ta méthode est définie dans le .h de ton Document (ou d'un autre répondeur de la liste) le menu sera activé, sinon pas. Pas besoin de bindings, c'est la disponibilité de la méthode dans la chaà®ne des répondeurs qui l'activera. Le cas courant (et antérieur aux bindings) est plutôt celui là