如何声明没有现有类的用于NSMenuItem的方法?

时间:2018-11-26 19:25:47

标签: objective-c cocoa sdl-2

我正在尝试为原本纯净的C项目创建一个典型的简单macOS菜单,这是其中仅有的Objective-C代码,我没有创建任何类或任何东西:

#import <Cocoa/Cocoa.h>

- (void)method_new_file:(id)sender { new_flag = 1; }

void mac_menu_file_init()
{
    NSMenu      *currentMenu;
    NSMenuItem  *menuItem;

    currentMenu = [[NSMenu alloc] initWithTitle:@"File"];   // set menu name

    [currentMenu addItemWithTitle:@"New..." action:@selector(method_new_file:)  keyEquivalent:@"n"];

    // Put menu into the menubar and give up our references to the objects
    menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
    [menuItem setSubmenu:currentMenu];
    [[NSApp mainMenu] insertItem:menuItem atIndex:1];
    [currentMenu release];
    [menuItem release];
}

问题很明显,我在method_new_file中“缺少方法声明的上下文”,但是我从这里去哪里呢?我只是希望每当我单击菜单项时都调用该方法,但是要实现这一点,它必须是某些东西的一部分,但是呢?根据代码和答案,我已经尝试过以下操作:

@interface My_Actions : NSApplication
@end

@implementation My_Actions

- (void)method_new_file:(id)sender { new_flag = 1; }

@end

及其它类似的东西无济于事,菜单项仍然无可救药地变成灰色,我不知道还能尝试什么。

1 个答案:

答案 0 :(得分:1)

好吧,我希望SDL2将提供一种添加菜单项的机制。

如果没有,则需要一个对象来与菜单项一起定位。在Objective-C中,类也是对象(它们的元类的实例),并且它们在生命周期中方便地是静态的。因此,您可以这样:

@interface MyMenuTarget : NSObject
@end

@implementation MyMenuTarget
+ (void) openNewFile:(id)sender
{
    new_flag = 1;
}
@end

注意方法声明上的+。这意味着该方法是类方法,而不是实例方法。但是,类方法只是类对象的方法(与实例方法相比,实例方法是类实例的方法)。

然后,在创建菜单项的地方,应将目标设置为此类:

menuItem = [currentMenu addItemWithTitle:@"New..." action:@selector(openNewFile:)  keyEquivalent:@"n"];
menuItem.target = [MyMenuTarget class];