某些应用程序,如 Photoshop,允许用户从 Web 浏览器中拖动图片,或从文件系统中拖动文件到 Dock 中的应用程序图标上。这样做会打开该应用程序中的文件。
这是怎么做到的?我想使用 Cocoa 和 Objective-C,但我对任何语言的任何解决方案都感兴趣。
某些应用程序,如 Photoshop,允许用户从 Web 浏览器中拖动图片,或从文件系统中拖动文件到 Dock 中的应用程序图标上。这样做会打开该应用程序中的文件。
这是怎么做到的?我想使用 Cocoa 和 Objective-C,但我对任何语言的任何解决方案都感兴趣。
NSApplication 允许您为您的应用程序设置委托。如果用户将文件拖到您的停靠图标上,NSApplication 将调用该方法
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
您的委托对象,以防它实现任何此类方法。如果内容不是真正的文件(例如,如果用户只是在应用程序中选择文本并将其拖到您的停靠图标上),则委托方法
- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication
叫做。
基本上,您可以创建任何类型的任何对象(例如,仅继承 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 并转换它们进入您的应用程序可以收听的委托调用或通知。
如果您的应用程序是基于文档的,并且您在 Info.plist 中正确填写了必要的键,那么它就可以工作。当用户将文件拖到应用程序的 Dock 磁贴时,如果文件属于您注册的类型,Dock 将在磁贴上突出显示您的应用程序,如果用户将文件放在那里,NSDocumentController 将实例化您的文档类之一文件。如果文件不是您注册的类型,两者都会忽略它。
那么,您的应用程序是基于文档的吗?如果是这样,该文件是您注册的类型之一吗?
了解更多信息: