【问题标题】:How to implement NSApplicationDelegate protocol in glfw application如何在 glfw 应用程序中实现 NSApplicationDelegate 协议
【发布时间】:2014-08-25 14:27:39
【问题描述】:

我目前在 MacOS X 中使用 glfw 编写应用程序。我唯一的问题是该应用程序不使用 AppDelegate,而是像命令行实用程序一样在 main.cpp 文件中进行所有初始化。我特别想实现这个功能

- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;

我已经在 plist 文件中注册了文件扩展名,当我尝试打开它们时,我收到一条错误消息“无法打开文档“Doc.xxx”。MyApp 无法打开“ xxx" 格式。

我试图创建一个将自己设置为委托的单例,但它只是不调用该函数。任何人都可以评论创建类和实现 NSApplicationDelegate 函数的可能性吗?

【问题讨论】:

  • 为什么不在普通的 Cocoa 应用程序中使用 NSOpenGLView?
  • 该应用程序是多平台的,它是使用 glfw 构建的。如果我更改此流程,我必须与团队中的其他开发人员维护一个单独的版本。我知道如何在纯客观-C 中做到这一点

标签: c++ macos glfw nsapplication-delegate


【解决方案1】:

基本上,您的代码中没有任何内容可以从操作系统接收事件并抽取接收到的事件。

根据另一个堆栈溢出 Q/A,解决方案似乎是手动调用 NSApplication。您仍然需要决定将 OpenGL 渲染循环挂接到何处,因为 [NSApp run] 在应用程序完成之前不会返回。另一种解决方案可能是进行自定义 NSApplication 替换。 http://www.cocoawithlove.com/2009/01/demystifying-nsapplication-by.html

考虑到 ARC 的修改,从这个答案中逐字复制:https://stackoverflow.com/a/2154666/1874323

@autoreleasepool { 
    AppDelegate * delegate = [[AppDelegate alloc] init];

    NSApplication * application = [NSApplication sharedApplication];
    [application setDelegate:delegate];
    [NSApp run]; // Note this never returns until the app finishes, so you need to decide where to hook your code into
}

与往常一样,您可以从 Apple 网站找到文档: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSApplication_Class/Reference/Reference.html

【讨论】:

  • 这是我自己得到的,但是(根据您的评论)[NSApp run] 没有返回,因此其余代码永远不会运行。
  • 我知道一些开发人员使用 NSTimer 或 CVDisplayLink 技巧来实现他们的游戏循环。 NSTimer 将由主线程事件队列驱动,而 CVDisplayLink 链接到机器的硬件。 developer.apple.com/library/mac/qa/qa1385/_index.html
  • 我最终删除了 glfw 并像这样实现它,它破坏了对其他平台的兼容性,因为我的 main 不同,但这是让应用程序委托方法工作的唯一方法。
猜你喜欢
  • 2011-07-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多