Создание окна из пункта меню - PullRequest
1 голос
/ 19 мая 2010

Я бы хотел три пункта меню в строке меню с сочетаниями клавиш cmd-1, cmd-2, cmd-3. Это я умею делать.

Каждый пункт меню открывает отдельное окно (win1, win2, win3).

Я хочу, чтобы разрешалось открывать только один экземпляр каждого окна одновременно (т. Е. Только один win1, один win2 и т. Д.).

Как лучше всего подойти?

1 Ответ

4 голосов
/ 19 мая 2010

Если указанные окна находятся в MainMenu.nib, это просто; прикрепить действие к -makeKeyAndOrderFront: в каждом окне.

Если, с другой стороны, они являются , а не в MainMenu.nib, что более вероятно в случае, если ваше приложение структурировано в разумном порядке; все становится немного сложнее. Короче; вам нужно прикрепить действия пункта меню к соответствующим методам на некотором типе объекта контроллера (скорее всего, ваш делегат приложения, хотя любой контроллер, который «видит» все необходимые перья, будет делать); и затем попросите контроллер отправить аналогичное сообщение в его окно.

Как правило, это разумный подход, так как к вашим окнам могут быть прикреплены меньшие объекты контроллера, которые при необходимости также выступают в качестве источников данных для различных представлений в рассматриваемых окнах.

Это также допускает ленивую загрузку окон, что, по последним подсчетам, Good Thing ™.

Если это какой-то вид документа-ориентированного (не обязательно основанного на документе ) приложения, и в окнах отображается некоторый атрибут выбранного в настоящий момент "документа" или фрагмента данных; Подклассы NSWindowController и загрузка оконных контроллеров в MainMenu.nib, вероятно, - хорошее место для начала.

Примечание: Если объекты, отвечающие за управление окнами, живут в цепочке респондента, на них даже не нужно ссылаться в MainMenu.nib; вы можете просто прикрепить с соответствующим именем IBAction s (например, openDetailsWindow: или тому подобное), используемые для открытия окон, к виртуальному объекту FirstResponder. (Просто добавьте селекторы к его списку известных методов, и вы получите великолепный результат.)

Reedit: Чтобы окно не появлялось в меню окон, вы можете позвонить [window setExcludedFromWindowsMenu:YES].

Проверка / снятие отметки с пункта меню немного сложнее, так как он требует, чтобы ваш оконный контроллер действительно знал о пункте меню; но до тех пор, пока это так, опять все довольно просто; вызов -setState: с соответствующими именами состояний (NSOffState, NSOnState), например, из методов делегата, вызываемых при показе / закрытии окна. (Это может, опять же, быть инкапсулировано «внутри» делегата приложения; если вы по какой-либо причине не хотите, чтобы ваш MainMenu.nib содержал контроллеры окна.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...