在 Objective-C 中以编程方式创建 Mojave Cocoa window

Create Mojave Cocoa window programmatically in Objective-C

我正在尝试创建一个最小的应用程序以便我从头开始启动游戏引擎。这是代码:

#import <Cocoa/Cocoa.h>

int main (int argc, const char * argv[]){
    NSWindow *window = [[NSWindow alloc] init];
    [window makeKeyAndOrderFront:nil];
    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false)
    while (1);
    return 0;
}

我想知道如何在不调用 CFRunLoopRunInMode() 的情况下显示 window。

Xcode 10.1

MacOS 10.14.3

您拥有的不是 Cocoa 应用程序。

您需要使用 Xcode 模板来创建一个简单的 window、Cocoa 应用程序。该模板将包含启动 AppKit (NSApplicationMain(argc,argv);) 的 main()。此函数执行(大约)5,000 个小东西,这些小东西构成了 Cocoa 应用程序 运行.

在应用程序包的 Info.plist 中,您可以将 NSApplication 的自定义子类定义为 运行 您的应用程序,或者更常见的是,在 MainMenu.xib 中定义自定义子类NSApplicationDelegate 对象。

一旦 AppKit 已初始化并准备好启动您的应用程序,这两个对象都会收到一条消息,您可以覆盖并添加您的自定义启动代码。

标准模板可以完成所有这些工作,因此只需使用它来创建一个新项目,然后将您的代码添加到 -applicationDidFinishLaunching:

我想我自己找到了答案。除非收到 nextEventMatchingMask: 消息,否则 window 不会出现。这可能是在 CFRunLoop 中触发 window 的原因,也是我想知道的,但如果我能深入挖掘就更好了。现在,我对以下解决方案感到满意。

#import <Cocoa/Cocoa.h>
int main (int argc, const char * argv[]){
@autoreleasepool {
    // Create a default window
    NSWindow *window = [[NSWindow alloc] init];
    // Make it blue just for better visibility
    [window setBackgroundColor:[NSColor blueColor]];
    // Bring to front and make it key
    [window makeKeyAndOrderFront:nil];
    // Custom run loop
    NSEvent* event;
    while(1) {
        do {
            event = [window nextEventMatchingMask:NSEventMaskAny]; //window shows now
            if ([event type] == NSEventTypeLeftMouseDown) {
                NSLog(@"Mouse down");
            }
            else {
                NSLog(@"Something happened");
            }
        } while (event != nil);
    }
}
return 0;
}

我没有这方面的参考资料。只能参考这篇文章:Handmade Hero for mac,里面的window也是类似的方法。这对我来说还不够好,因为这种方法涉及 NSApp,如果可能的话,我想避免它。