Как объявить метод, используемый для NSMenuItem без существующих классов? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать типичное простое меню macOS для моего остального чистого C-проекта, и это единственный код 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 голосов
/ 27 ноября 2018

Что ж, я надеюсь, что 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];
...