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

问题描述 投票:0回答:2

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

因此,我实现了

NSApplicationDelegate
application:openFile:
application:openFiles:
方法,这些方法在应用程序未运行时按预期工作。

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

我也尝试实施

application:openURLs:
。此方法具有相同的行为:如果事件发生时应用程序已经在运行,则不会调用该方法。

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

macos launch appkit nsapplication-delegate
2个回答
4
投票

这在文档中没有提到,但是根据这个答案

application:openFile:
的工作方式是
NSApplication
odoc
Apple事件转发给其委托。

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

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

我假设这个现有的事件处理程序在

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

从构建中删除此旧代码会导致调用

NSApplicationDelegate
方法,从而解决问题。


1
投票

以下方法有效吗?

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

如果您的委托实现了此方法,AppKit 不会调用 application:openFile: 或 application:openFiles: 方法。

© www.soinside.com 2019 - 2024. All rights reserved.