(Если вы хотите изменить макет меню, аналогично тому, как меню «Аэропорт» отображает дополнительную информацию, когда вы щелкаете по нему, затем продолжайте чтение. Если вы хотите сделать что-то совсем другое, этот ответ может быть не таким релевантно, как вы хотите.)
Ключ -[NSMenuItem setAlternate:]
. Для примера, скажем, мы собираемся создать NSMenu
, в котором есть действие Do something...
. Вы бы закодировали это как что-то вроде:
NSMenu * m = [[NSMenu alloc] init];
NSMenuItem * doSomethingPrompt = [m addItemWithTitle:@"Do something..." action:@selector(doSomethingPrompt:) keyEquivalent:@"d"];
[doSomethingPrompt setTarget:self];
[doSomethingPrompt setKeyEquivalentModifierMask:NSShiftKeyMask];
NSMenuItem * doSomething = [m addItemWithTitle:@"Do something" action:@selector(doSomething:) keyEquivalent:@"d"];
[doSomething setTarget:self];
[doSomething setKeyEquivalentModifierMask:(NSShiftKeyMask | NSAlternateKeyMask)];
[doSomething setAlternate:YES];
//do something with m
Теперь вы можете подумать, что это создаст меню с двумя пунктами: «Сделай что-нибудь ...» и «Сделай что-нибудь», и вы будете частично правы. Поскольку мы устанавливаем второй пункт меню как альтернативный, и поскольку оба пункта меню имеют одинаковый ключевой эквивалент (но разные маски модификаторов), то будет показан только первый (то есть тот, который по умолчанию setAlternate:NO
). Затем, когда вы откроете меню, если вы нажмете маску модификатора, которая представляет вторую (т. Е. Клавишу опции), тогда пункт меню в реальном времени преобразуется из первого пункта меню во второй.
Так работает, например, меню Apple. Если вы нажмете на него один раз, вы увидите несколько вариантов с эллипсами после них, такие как «Перезагрузка ...» и «Выключение ...». HIG указывает, что если есть многоточие, это означает, что система запросит у пользователя подтверждение перед выполнением действия. Однако, если вы нажмете клавишу параметров (с открытым меню), вы заметите, что они изменяются на «Перезагрузка» и «Выключение». Эллипсы исчезают, что означает, что если вы выберете их, пока нажата клавиша выбора опции, они будут выполняться немедленно, не запрашивая у пользователя подтверждения.
Та же общая функциональность сохраняется для меню в элементах статуса. Вы можете иметь расширенную информацию, которая будет «альтернативой» элементам обычной информации, которая появляется только при нажатии клавиши выбора. Как только вы поймете базовый принцип, на самом деле его довольно легко реализовать без особых хитростей.