Как я могу убедиться, что метод вызывается каждый раз, когда я расширяю NSMenu. Я попытался подключить действие из раскадровки, но действие, похоже, срабатывает только при нажатии пунктов меню, а не в самом меню.Обнаружить нажмите на контекстное меню osx
[item setAction: @selector(play:)]
Я хотел бы запустить метод, когда, например, в меню помощи получает расширено, чтобы обновить включенное и выключенное содержание этого меню, так как предполагается, будет отличаться для опознан и не зарегистрированных пользователей. .
Update:
Я добавил протокол NSMenuDelegate в скобках в моем
@interface ClientAppDelegate : NSObject<NSApplicationDelegate,NSMenuDelegate>
Добавление элементов меню работает, но меню, похоже, не влияет на методы делегата.
// Create the application on the UI thread.
- (void)createApplication:(id)object {
NSApplication* application = [NSApplication sharedApplication];
[NSBundle loadNibNamed:@"MainMenu" owner:NSApp];
// Set the delegate for application events.
[application setDelegate:self];
// Add the Tests menu.
NSMenu* menubar = [application mainMenu];
[menubar setDelegate:self];
// TIDAL Create Controlls
NSMenuItem *controlsItem = [[[NSMenuItem alloc] initWithTitle:@"Controls"
action:nil
keyEquivalent:@""] autorelease];
NSMenu *controlsMenu = [[[NSMenu alloc] initWithTitle:@"Controls"] autorelease];
AddMenuItem(controlsMenu, @"Pl", ID_L_PL);
[controlsItem setSubmenu:controlsMenu];
[menubar addItem:controlsItem];
......
-(void) menuWillOpen:(NSMenu *)menu{
wprintf(L"ITEM CLICK CAN I UPDATE MENU VISIBILITY HERE?");
}
-(void) menuNeedsUpdate:(NSMenu *)menu{
wprintf(L"ITEM CLICK CAN I UPDATE MENU VISIBILITY HERE?");
}
Update2:
Так что я начал снова, imaginging, что проблема что-то делать со ссылками и тот факт, что я разрабатывал в Objective-C++. Однако я не могу заставить его работать только в минимальном примере Obj-C, ниже - мой код. Единственным обратным вызовом, который, похоже, работает, является тот, который обрабатывает клики по элементам. Может быть проблема присутствует в связи с тем, что я использую:
_menubar = [application mainMenu];
[_menubar setDelegate:self];
Чтобы получить мою строку меню и настроить мое меню делегата?
//
// AppDelegate.m
// menuTest
//
// Created by David Karlsson on 27/02/15.
// Copyright (c) 2015 David Karlsson. All rights reserved.
//
#import "AppDelegate.h"
void AddMenuItem(NSMenu *menu, NSString* label, int idval) {
NSMenuItem* item = [menu addItemWithTitle:label
action:@selector(menuItemSelected:)
keyEquivalent:@""];
[item setTag:idval];
}
@interface AppDelegate()
@property (weak) IBOutlet NSWindow *window;
@property (strong) IBOutlet NSMenu * menubar;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSLog(@"Launched menu test");
// Insert code here to initialize your application
NSApplication* application = [NSApplication sharedApplication];
//[NSBundle loadNibNamed:@"MainMenu" owner:NSApp];
// Set the delegate for application events.
[application setDelegate:self];
// Add the Tests menu.
_menubar = [application mainMenu];
[_menubar setDelegate:self];
NSMenuItem *controlsItem = [[NSMenuItem alloc] initWithTitle:@"Controls"
action:nil
keyEquivalent:@""];
NSMenu *controlsMenu = [[NSMenu alloc] initWithTitle:@"Controls"];
AddMenuItem(controlsMenu, @"1", 123);
AddMenuItem(controlsMenu, @"2", 124);
AddMenuItem(controlsMenu, @"3", 154);
[controlsItem setSubmenu:controlsMenu];
[_menubar addItem:controlsItem];
}
-(void) menuWillOpen:(NSMenu *)menu{
NSLog(@"ITEM CLICK CAN I UPDATE MENU VISIBILITY HERE?");
}
-(void) menuNeedsUpdate:(NSMenu *)menu{
NSLog(@"ITEM CLICK CAN I UPDATE MENU VISIBILITY HERE?");
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
NSLog(@"Teardown menu test");
}
- (IBAction)menuItemSelected:(id)sender {
// Retrieve the active RootWindow.
NSWindow* key_window = [[NSApplication sharedApplication] keyWindow];
if (!key_window){
return;
}
NSLog(@"CLICK");
}
@end