【问题标题】:How do I make an OS X application react when a file, picture, etc is dropped on its dock icon?当文件、图片等放在其停靠图标上时,如何使 OS X 应用程序做出反应?
【发布时间】:2010-10-04 19:18:31
【问题描述】:

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

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

【问题讨论】:

  • 我不认为你可以使用 Cocoa 和 C#。我只知道来自 Ruby、Python 和 Objective-C 的 Cocoa 绑定(据我了解,Objective-C 是最好的支持)。虽然您可以使用 C# 和 Mono 编写 OS X 应用程序,但我认为您不能使用 C# 中的 Cocoa。

标签: objective-c cocoa macos dock


【解决方案1】:

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

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

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

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

被调用。

NSApplication class reference

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    更多信息:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2014-07-21
    • 2012-05-29
    • 1970-01-01
    相关资源
    最近更新 更多