某些应用程序(如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将实例化您的一个文档类文件.如果该文件不是您注册的类型,则两者都将忽略该文件.
那么,您的应用程序是基于文档的吗?如果是,该文件是您注册的类型之一吗?
欲获得更多信息:
适用于Mac的基于文档的应用编程指南
信息财产清单重点参考
如何使你的应用程序的Dock平铺突出显示[如果它应该但不是]