如何在不存在 类 的情况下声明用于 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];
我正在尝试为我的其他纯 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];