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

问题描述 投票:0回答:2

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

#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-c cocoa macos-mojave programmatically-created
2个回答
0
投票

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

您需要使用Xcode模板创建一个简单的一个窗口Cocoa应用程序。该模板将包含启动AppKit(main())的NSApplicationMain(argc,argv);。这个函数执行(大约)5000个小东西,使Cocoa应用程序运行。

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

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

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


0
投票

我想我已经找到了答案。除非接收到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,如果可能的话我想避免使用NSApp。

© www.soinside.com 2019 - 2024. All rights reserved.