2010-05-18 3 views
1

Je voudrais afficher trois éléments de menu dans la barre de menus avec les raccourcis clavier cmd-1, cmd-2, cmd-3. C'est ce que je sais faire.Création d'une fenêtre à partir d'un élément de menu

Chaque élément de menu ouvrirait une autre fenêtre (win1, win2, win3).

Je veux en sorte que seule instance de chaque fenêtre est autorisé à être ouvert à tout moment (à savoir un seul win1, un win2, etc.).

Comment cette approche est-elle la meilleure?

Répondre

4

Si les fenêtres en question sont dans le MainMenu.nib c'est simple; attachez l'action à -makeKeyAndOrderFront: sur chaque fenêtre.

Si, d'autre part, ils ne sont pas dans MainMenu.nib, comme il est plus probable que le cas si votre application est structuré d'une manière saine d'esprit; les choses deviennent un peu plus compliquées. Longue histoire courte; vous devez attacher les actions de l'élément de menu aux méthodes appropriées sur une certaine manière d'objet de contrôleur (probablement votre délégué d'application, bien que n'importe quel contrôleur qui «voit» toutes les plumes requises fera l'affaire); et ensuite le contrôleur en question envoie un message similaire à sa fenêtre.

Ceci est généralement une approche sensible, comme vous pouvez avoir de plus petits objets de contrôleur attachés à vos fenêtres qui agissent également, le cas échéant, en tant que sources de données pour les différentes vues dans les fenêtres en question.

Il permet également le chargement paresseux des fenêtres, ce qui est, au dernier décompte, une bonne chose ™.

S'il s'agit d'une application orientée document (pas nécessairement document), et les fenêtres affichent un attribut du «document» ou morceau de données sélectionné; sous-classement NSWindowController et le chargement des contrôleurs de fenêtre dans votre MainMenu.nib est probablement un bon point de départ.

Remarque: Si les objets chargés de contrôler les fenêtres résident dans la chaîne du répondeur, ils n'ont même pas besoin d'être référencés dans MainMenu.nib; vous pouvez simplement joindre les correctement nomméIBAction s (par exemple openDetailsWindow: ou similaires) utilisés pour ouvrir les fenêtres à l'objet FirstResponder virtuel. (Il suffit d'ajouter les sélecteurs à sa liste des méthodes connues, et vous êtes d'or.)

remodifier: Pour que la fenêtre soit pas dans le menu Windows, vous pouvez appeler [window setExcludedFromWindowsMenu:YES].

Pour cocher/décocher l'option de menu est un peu Tricker, car il a besoin de votre contrôleur de fenêtre savoir en fait de la commande de menu; mais tant que c'est le cas, c'est encore assez simple; appelez -setState:, avec les noms d'état appropriés (NSOffState, NSOnState), par exemple à partir des méthodes déléguées appelées lorsque la fenêtre est affichée/fermée. (Ceci pourrait, encore une fois, être encapsulé "dans" le délégué de l'application, si pour une raison quelconque vous ne voulez pas que votre MainMenu.nib contienne les contrôleurs de fenêtre.)

+0

Sur une note connexe. Si vous regardez dans l'élément de menu iTunes Window, vous pouvez lancer 2 fenêtres (iTunes et Equalizer). Lorsque l'une ou l'autre (ou les deux) de ces fenêtres sont affichées, une coche apparaît à côté d'elles pour l'indiquer. De plus, le titre de ces deux fenêtres n'apparaît plus dans l'élément de menu Fenêtre. Comment est-ce que j'aborderais cela? – Garry

+0

Réponse mise à jour; Je vous suggère de distiller les commentaires dans votre question initiale (en utilisant le bouton Modifier).Permet aux gens de trouver l'information plus facilement plus tard. :) –

Questions connexes