繁体   English   中英

当文件,图片等放在其停靠栏图标上时,如何让OS X应用程序做出反应?

[英]How do I make an OS X application react when a file, picture, etc is dropped on its dock icon?

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

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

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

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

你的委托对象,如果它实现任何这样的方法。 如果内容实际上不是文件(例如,如果用户只选择应用程序中的文本并将其拖放到停靠栏图标上),则委托方法

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

叫做。

请参阅NSApplication类参考

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

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

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

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

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

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

欲获得更多信息:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM