我想在用户双击我的应用程序创建的文件或将此类文件拖到停靠图标上时处理打开的事件。
因此,我实现了NSApplicationDelegate
的application:openFile:
和application:openFiles:
方法,这些方法在应用程序未运行时按预期工作。
但是,如果在发生 open 事件时应用程序已在运行,则应用程序将获得焦点,但永远不会调用上述方法(不会命中其中的断点(,并且文件不会打开。
我也尝试实施application:openURLs:
.此方法具有相同的行为:如果事件发生时应用程序已在运行,则不会调用此方法。
当应用程序已经运行时,我是否需要实现不同的函数来处理打开的文件,或者我是否需要执行/设置其他操作才能在这些情况下调用现有函数?
文档中没有提到这一点,但根据这个答案,application:openFile:
的工作方式是它NSApplication
odoc
Apple Events 转发给其委托。
有了这些知识,我能够在应用程序中找到以下旧的Carbon调用:
osError = AEInstallEventHandler(kCoreEventClass,
kAEOpenDocuments,
g_OpenDocumentsUPP,
0L,
false);
我假设这个现有的事件处理程序在NSApplication
有机会处理它之前就使用了 Apple 事件。但是,当应用尚未运行时,NSApplication
会在调用上述设置事件处理程序的行之前处理事件,因此行为不同。
从构建中删除此旧代码会导致调用NSApplicationDelegate
方法,从而修复了该问题。
以下方法有效吗?
- (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.