为什么在应用程序已运行时未调用application:openFile :?

时间:2018-06-22 22:32:29

标签: macos launch appkit nsapplication-delegate

当用户双击由我的应用程序创建的文件或将此类文件拖到停靠图标时,我想处理打开事件。

因此,我已经实现了NSApplicationDelegate的{​​{3}}和application:openFile:方法,它们在应用程序不运行时可以按预期工作。

但是,如果在打开事件发生时应用程序已经在运行,则应用程序将变为焦点状态,但是永远不会调用上述方法(不会击中它们内部的断点)并且文件也不会打开。

我还尝试实现application:openFiles:。此方法具有相同的行为:事件发生时,如果应用程序已在运行,则不会调用该方法。

在应用程序已经运行时,我是否需要实现不同的功能来处理打开文件,还是需要做/设置其他事情以便在这种情况下调用现有功能?

2 个答案:

答案 0 :(得分:2)

the documentation中未提及,但是according to this answer application:openFile:的工作方式是NSApplicationodoc Apple Events转发给其委托人。 / p>

有了这些知识,我就能在应用程序中找到以下旧的Carbon通话:

osError = AEInstallEventHandler(kCoreEventClass,
                                kAEOpenDocuments,
                                g_OpenDocumentsUPP,
                                0L,
                                false);

我假设这个现有的事件处理程序在NSApplication有机会处理之前就消耗了Apple Event。但是,当应用尚未运行时,NSApplication将在设置事件处理程序的上述行被调用之前处理事件,因此会产生不同的行为。

从构建中删除此旧代码会导致调用NSApplicationDelegate方法,从而解决了问题。

答案 1 :(得分:-1)

以下方法有效吗?

- (void)application:(NSApplication *)application 
       openURLs:(NSArray<NSURL *> *)urls;

If your delegate implements this method, AppKit does not call the
application:openFile: or application:openFiles: methods.