15

某些应用程序,如 Photoshop,允许用户从 Web 浏览器中拖动图片,或从文件系统中拖动文件到 Dock 中的应用程序图标上。这样做会打开该应用程序中的文件。

这是怎么做到的?我想使用 Cocoa 和 Objective-C,但我对任何语言的任何解决方案都感兴趣。

4

2 回答 2

21

NSApplication 允许您为您的应用程序设置委托。如果用户将文件拖到您的停靠图标上,NSApplication 将调用该方法

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename

您的委托对象,以防它实现任何此类方法。如果内容不是真正的文件(例如,如果用户只是在应用程序中选择文本并将其拖到您的停靠图标上),则委托方法

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

叫做。

请参阅NSApplication 类参考

基本上,您可以创建任何类型的任何对象(例如,仅继承 NSObject 的简单对象),在对象中定义上述两种方法,然后在您执行的应用程序的启动代码中的任何位置

whatever = [[YourObject alloc] init];
[[NSApplication sharedApplication] setDelegate:whatever];

就是这样。只要将文件或其他一些内容拖放到停靠图标上,就会调用相应的方法并且必须处理该请求。顺便说一句,如果您的应用程序与文件类型(例如 .myFileType)相关联并且用户在 Finder 中双击具有该扩展名的文件,则会调用相同的方法。

幕后真正发生的是启动服务向您的应用程序发送“打开文档”('odoc')Apple 事件。NSApplication 默认为这个事件注册一个句柄,并通过调用适当的委托方法转发请求。我猜你也可以直接收听这个 Apple Event,但你为什么会呢?直接处理 Apple Events 很尴尬。当您的应用程序不是 Cocoa,而是 Carbon(纯 C)时,您可能必须直接处理 Apple Event(我对 Carbon 不熟悉),但在 Cocoa 中,Apple 已经为您捕获了最重要的 Apple Events 并转换它们进入您的应用程序可以收听的委托调用或通知。

于 2009-02-03T12:48:58.217 回答
6

如果您的应用程序是基于文档的,并且您在 Info.plist 中正确填写了必要的键,那么它就可以工作。当用户将文件拖到应用程序的 Dock 磁贴时,如果文件属于您注册的类型,Dock 将在磁贴上突出显示您的应用程序,如果用户将文件放在那里,NSDocumentController 将实例化您的文档类之一文件。如果文件不是您注册的类型,两者都会忽略它。

那么,您的应用程序是基于文档的吗?如果是这样,该文件是您注册的类型之一吗?

了解更多信息:

于 2009-02-01T19:22:52.090 回答