首页 > 解决方案 > 在 Objective-C 中以编程方式创建 Mojave Cocoa 窗口

问题描述

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

#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() 的情况下显示一个窗口。

Xcode 10.1

macOS 10.14.3

标签: objective-ccocoamacos-mojaveprogrammatically-created

解决方案


我想我自己已经找到了答案。除非收到 nextEventMatchingMask: 消息,否则该窗口不会出现。这可能是触发 CFRunLoop 窗口的原因,也是我想知道的,尽管如果我能更深入地挖掘会很好。目前,我对以下解决方案感到满意。

#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,由于类似的方法出现了窗口。这对我来说还不够好,因为这种方法涉及 NSApp,如果可能的话,我想避免这种方法。


推荐阅读