一些应用程序(如 Photoshop)允许用户从 Web 浏览器中拖动图片,或从文件系统中拖动文件到 Dock 中的应用程序图标上。这样做会在该应用程序中打开文件。
这是怎样完成的?我想使用Cocoa和Objective-C,但我对任何语言的解决方案都感兴趣。
一些应用程序(如 Photoshop)允许用户从 Web 浏览器中拖动图片,或从文件系统中拖动文件到 Dock 中的应用程序图标上。这样做会在该应用程序中打开文件。
这是怎样完成的?我想使用Cocoa和Objective-C,但我对任何语言的解决方案都感兴趣。
NSApplication可以为您的应用程序设置代理。如果用户将文件拖到您的Dock图标上,则NSApplication将调用该方法。 (NSApplication allows you to set a delegate for your application. If the user drags a file onto your dock icon, NSApplication will call the method)
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
如果您的代理对象实现了任何此类方法,则会被调用。如果内容不是一个真正的文件(例如,如果用户只是在应用程序中选择文本并将其拖到您的 dock 图标上),则会调用委托方法。
- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication
被称为。
请参见NSApplication类参考。
基本上,您可以创建任何类型的任何对象(例如一个简单的继承自NSObject的对象),在对象中定义上述的两种方法,然后在应用程序的启动代码的任何位置进行操作。
whatever = [[YourObject alloc] init];
[[NSApplication sharedApplication] setDelegate:whatever];
这就是了。只要文件或其他内容被放置在码头图标上,相应的方法就会被调用,并且必须处理该请求。顺便说一句,如果您的应用程序与文件类型(例如.myFileType)相关联,并且用户在查找器中双击具有该扩展名的文件,则会调用相同的方法。
What really happens behind the scenes is that Launch Services sends your application an "open documents" ( odoc ) Apple Event. NSApplication by default registers a handle for this event and forwards the request by calling the appropriate delegate method. You can also directly listen to this Apple Event I guess, but why would you? Dealing with Apple Events directly is awkward. When your application is not Cocoa, but Carbon (plain-C), you may have to directly process the Apple Event (I m not familiar with Carbon), but in Cocoa Apple already catches the most important Apple Events for you and converts them into delegate calls or notifications your application can listen to.
如果您的应用程序基于文档,并且您已正确填写Info.plist中的必要键,则它会顺利工作。当用户将文件拖到您的应用程序的Dock图块上时,如果该文件是您注册的一种类型,则Dock将在图块上突出显示您的应用程序,如果用户将文件放在那里,则NSDocumentController将为该文件实例化一个文档类。如果该文件不是您注册的一种类型,则两者都会忽略它。
那么,你的应用是否基于文档?如果是,文件是否属于你注册的类型之一?
有关更多信息: