我正在尝试为原本纯净的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
及其它类似的东西无济于事,菜单项仍然无可救药地变成灰色,我不知道还能尝试什么。
答案 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];