在 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,如果可能的话,我想避免它。
我正在尝试创建一个最小的应用程序以便我从头开始启动游戏引擎。这是代码:
#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,如果可能的话,我想避免它。