4

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

因此,我实现了NSApplicationDelegate'sapplication:openFile:application:openFiles:方法,它们在应用程序未运行时按预期工作。

但是,如果在打开事件发生时应用程序已经在运行,则应用程序将获得焦点,但上述方法永远不会被调用(其中的断点不会被命中)并且文件不会打开。

我也尝试实施application:openURLs:. 此方法具有相同的行为:如果在事件发生时应用程序已经在运行,则不会调用它。

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

4

2 回答 2

3

文档中没有提到这一点,但根据这个答案application:openFile:工作方式是将Apple 事件NSApplication转发给其代表。odoc

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

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

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

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

于 2018-06-25T13:29:53.363 回答
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.
于 2018-06-23T08:44:17.810 回答