objective-c - 在 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
解决方案
我想我自己已经找到了答案。除非收到 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,如果可能的话,我想避免这种方法。
推荐阅读
- java - 使用直接算术表达式和在运行时将值传递给方法之间有什么区别吗?
- javascript - 使用带有 appendchild 的 javascript 从一个 div 添加到另一个(不工作)
- python - 从 Microsoft excel csv 文件复制范围
- javascript - 将节点数组传递给 ejs 文件中的 JavaScript
- sql-server - 如何限制另一个帐户访问 SQL Server 中的数据库
- javascript - Powershell单击Internet Explorer中的javascript按钮
- regex - 删除以日期格式结尾的日志
- vue.js - 将 v-model 与 v-select 一起使用,其中初始 v-model 值不在 items 标记中
- mysql - 如何用 SELECT 查询的结果覆盖整个表?(MySQL)
- reactjs - 如何在记忆化的 React 组件上正确键入静态属性?