2010-05-19 2 views
1

У меня есть nib (winA.xib), который содержит окно. Мой делегат приложения содержит подкласс NSWindowController под названием WinAController.Получение определенного пункта меню из MainMenu

WinAController имеет свойство (NSMenu * mainMenu), которое я хочу указать на MainMenu. Я поставил его после того, как я создаю экземпляр WinAController с этим кодом:

WinAController = [[WinAController alloc] initWithWindowNibName:@"WinA"]; 
    WinAController.mainMenu = [NSApp mainMenu]; 

У меня есть пункт меню под пунктом «Окно» верхний уровень меню на MainMenu, который вызывает [WinAController ShowWindow] метод и отображает WINA. Я хочу переключить состояние включения/выключения этого пункта меню в зависимости от того, виден ли WinA или нет. WinAController также имеет другое свойство (NSMenuItem * myMenuItem).

Как получить ссылку на подменю меню верхнего уровня «Окно». Название элемента подменю, которое я хочу получить, это «Команда». Я пробовал:

if (mainMenu != nil) { 
    myMenuItem = [mainMenu itemAtIndex:[mainMenu indexOfItemWithTitle:@"Command"]]; 
} 

Но он не работает.

Куда я иду не так?

Спасибо,

Edit: я теперь размещены WinAController в mainMenu.xib. Я установил WinA (в winA.xib) владельца файла как класс WinAController, но я не могу понять, как подключить WinAcontroller окно IBOutlet к WinA, поскольку они находятся в разных норах!

ответ

1

I Думаю, я сказал вам поставить контроллеры окон в MainMenu.xib?

Ой, ничего не отважилось, ничего не получилось. То, что вы хотите сделать, конечно, заключается в следующем:

@interface MyApplicationDelegate : NSObject { 
    IBOutlet NSMenuItem *winAMenuItem; 
} 

@property(assign) IBOutlet NSMenuItem *winAMenuItem; 

@end 

Затем вы можете получить доступ к этому через [[NSApp delegate] winAMenuItem];

+0

Я очень новичок в nib-файлах, и большая часть работы, которую я делал до настоящего времени, создавала вещи программно - я не был уверен в создании пользовательского NSWindowController в IB. Возможно, я сейчас передумаю. На самом деле я нахожу IB более сложным, чем Xcode! – Garry

+0

Как в стороне, вы подключаете выходное отверстие окна в окошке окна и пункт меню в MainMenu.nib. –

3

Вы можете сохранить ссылку на свой пункт меню напрямую, возможно через IBOutlet в своем главном наконечнике.

Или (лучше, ИМО), вы можете реализовать -validateMenuItem: в WinAController и установить состояние там (таким образом, государство только установить, когда пользователь будет фактически видеть его, тоже):

- (BOOL)validateMenuItem:(NSMenuItem *)item { 
    if ([item action] == @selector(showWindow:)] 
     [item setState:[winA isVisible] ? NSOnState : NSOffState]; 

    return YES; 
} 
+0

контроллер окна не будет только в цепочке ответчик (и таким образом иметь возможность для проверки пункт меню), когда окно активно? Когда окно скрыто, оконный контроллер не получит сообщение проверки, так что метод не сможет перенастроить элемент меню, чтобы отразить это состояние. –

+0

Нет, если целью пункта меню является объект, о котором идет речь, IIRC. Если предмет нацелен на первого ответчика, тогда он сломается, хотя, да. Я должен дважды проверить ... – Wevah

+0

Да, то, что я сказал, применяется только тогда, когда пункт меню нацелен на первого ответчика. Если он нацелен непосредственно на оконный контроллер, тогда да, это сработает. –