Как синхронизировать несколько меню с одинаковыми параметрами? - PullRequest
1 голос
/ 18 декабря 2010

У моего приложения, очевидно, есть главное меню в строке меню. Один из этих пунктов меню содержит подменю, которое также доступно в NSPopUpButton где-то в моем приложении.

До сих пор я просто дублировал пункты меню (программно) в коде, чтобы сделать всплывающую кнопку, но когда я меняю имя селектора или название пунктов меню и т. Д., Я неизбежно забываю также сделать те же изменения во всплывающей кнопке.

Я бы хотел определить меню в одном месте и использовать его в двух. Это возможно?

Я пробовал это:

// Get the same menu used by the main menu
NSMenu *addMenu = [[[[[NSApp mainMenu] itemWithTitle:@"Project"] submenu] itemWithTitle:@"Add"] submenu];

NSMenuItem *item = [[[NSMenuItem alloc] init] autorelease];
[item setImage:[NSImage imageNamed:NSImageNameAddTemplate]];
[item setOnStateImage:nil];
[item setMixedStateImage:nil];

addButton = [[NSPopUpButton alloc] initWithFrame:NSMakeRect(2, 5, 26.0, 16.0)];
[addButton setPullsDown:YES];
[addButton setBordered:NO];
[[addButton cell] setUsesItemFromMenu:NO];
[[addButton cell] setMenuItem:item];
[[addButton cell] setArrowPosition:NSPopUpNoArrow];
[addButton setAutoresizingMask:NSViewMaxXMargin];
[addButton setToolTip:@"Add Files or Directories"];

// Use the same menu as the main menu
[addButton addItemWithTitle:@"Add"];
[[addButton lastItem] setSubmenu:addMenu]; // <--- Breaks here

К сожалению, это вызывает ошибку времени выполнения с:

2010-12-19 02: 56: 11.571 MojiBaker [85384: a0f] * Утверждение ошибка в - [NSMenuItem setSubmenu:], /SourceCache/AppKit/AppKit-1038.35/Menus.subproj/NSMenuItem.m:695

1 Ответ

2 голосов
/ 18 декабря 2010

Использование -copy сделало эту работу, но затем я заметил, что на всех сочетаниях клавиш появилась всплывающая кнопка, которая выглядела странно, поэтому я в итоге просто перебирал пункты главного меню и динамически создавал их так:

NSMenu *mainAddMenu = [[[[[NSApp mainMenu] itemWithTitle:@"Project"] submenu] itemWithTitle:@"Add"] submenu];
NSMenu *addMenu = [[[NSMenu alloc] initWithTitle:@"Add"] autorelease];
for (NSMenuItem *addMenuItem in [mainAddMenu itemArray]) {
    [addMenu addItemWithTitle:[addMenuItem title] action:[addMenuItem action] keyEquivalent:@""];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...