如何在不存在 类 的情况下声明用于 NSMenuItem 的方法?

How to declare a method used for NSMenuItem with no existing classes?

我正在尝试为我的其他纯 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];
}

问题很明显,我是 "missing a context for method declaration" for method_new_file,但是我从这里去哪里呢?我只想在单击菜单项时调用该方法,但要发生这种情况,它必须是某些东西的一部分,但是什么?根据我看到的代码和答案,我尝试了以下操作:

@interface My_Actions : NSApplication
@end

@implementation My_Actions

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

@end

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

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

如果没有,您需要一个对象来定位您的菜单项。在 Objective-C 中,classes 也是对象(它们的元 class 的实例)并且它们在生命周期中是静态的。所以,你可以这样做:

@interface MyMenuTarget : NSObject
@end

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

注意方法声明中的+。这意味着该方法是 class 方法,而不是实例方法。但是 class 方法只是 class 对象的一个​​方法(与作为 class 实例的方法的实例方法相比)。

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

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