Если указанные окна находятся в 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 содержал контроллеры окна.)