2015-02-25 3 views
0

Как я могу убедиться, что метод вызывается каждый раз, когда я расширяю 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 

ответ

1

Установите делегируют МЕНЮ, а затем использовать этот объект для реализации menuNeedsUpdate: из протокола NSMenuDelegate. Этот метод вызывается непосредственно перед отображением меню и специально предоставлен, чтобы вы могли вносить изменения в рассматриваемое меню до его появления на экране.

1

Вы хотите реализовать часть протокола NSMenu Delegate, и вам может понадобиться NSTimer, который работает в режимах, которые работают во время отслеживания меню, чтобы выполнять живые обновления, пока отображается меню.