gpt4 book ai didi

objective-c - 如何在没有现有类的情况下声明用于 NSMenuItem 的方法?

转载 作者:行者123 更新时间:2023-12-03 17:09:05 24 4
gpt4 key购买 nike

我正在尝试为我的纯 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

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

最佳答案

嗯,我希望 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];

关于objective-c - 如何在没有现有类的情况下声明用于 NSMenuItem 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53487753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com