Получение определенного пункта меню из MainMenu

У меня есть перо (winA.xib), содержащее окно. Мой делегат приложения содержит подкласс NSWindowController под названием WinAController.

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"]];
}

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

Где я ошибаюсь?

Спасибо,

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


person Garry Pettet    schedule 19.05.2010    source источник


Ответы (2)


Я думал, что сказал вам поместить контроллеры окон в MainMenu.xib?

Ну что ж, ничего не рискнуло, ничего не выиграло. Конечно, вы хотите сделать следующее:

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

@property(assign) IBOutlet NSMenuItem *winAMenuItem;

@end

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

person Williham Totland    schedule 19.05.2010
comment
Я очень новичок в файлах пера, и большая часть работы, которую я проделал до настоящего времени, заключалась в создании вещей программно - я не был уверен в создании настраиваемого NSWindowController в IB. Возможно, я сейчас еще раз подумаю. На самом деле я иногда нахожу IB более сложным, чем Xcode! - person Garry Pettet; 20.05.2010
comment
Кроме того, вы подключаете оконный выход к оконному наконечнику, а выход для пункта меню - в MainMenu.nib. - person Williham Totland; 20.05.2010

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

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

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

    return YES;
}
person Wevah    schedule 19.05.2010
comment
Разве оконный контроллер не будет находиться в цепочке респондентов (и, таким образом, сможет проверить пункт меню), когда окно активно? Когда окно скрыто, оконный контроллер не получит сообщение проверки, поэтому этот метод не сможет перенастроить пункт меню, чтобы отразить это состояние. - person Peter Hosey; 23.05.2010
comment
Нет, если целью пункта меню является рассматриваемый объект, IIRC. Если предмет нацелен на первого респондента, то он сломается, да. Я должен перепроверить ... - person Wevah; 23.05.2010
comment
Да, то, что я сказал, применимо только тогда, когда пункт меню нацелен на Первого респондента. Если он нацелен непосредственно на оконный контроллер, тогда да, это сработает. - person Peter Hosey; 23.05.2010