是否可以在Dock中的应用程序图标上打开沙箱应用程序中的承诺文件NSFilesPromisePboardType? Dock图标正在接受drop,但是-application:openFile:永远不会被调用.
我找到的唯一参考是预沙箱:
Accepting iCal events dropped on my application’s icon
解决方法
让我们分解一下:基于NSDocument的应用程序中的NSApplication和NSDocumentController为您提供了-application:openFile:或-opendocumentWithContentsOfURL:display:completionHandler:在NSFilenamesPboardType和NSURLPboardType丢弃的情况下免费提供.
注意:我认为这是使用kCoreEventClass / kAEopendocuments和kInternetEventClass / kAEGetURL的NSAppleEventManager事件处理程序实现的.
不幸的是,他们没有处理NSFilesPromisePboardType.
让我们刷新我们的粘贴板知识:粘贴板在所有应用程序之间共享.有复制,查找和拖动等任务的默认粘贴板.
当拖动开始时,应用程序将写入共享拖动粘贴板.所以我们现在需要的是关于Drop to Dock图标的通知.
这是NSService发挥作用的地方:
<key>NSServices</key> <array> <dict> <key>NSMessage</key> <string>openService</string> <key>NSSendTypes</key> <array> <string>public.data</string> </array> <key>NSMenuItem</key> <dict> <key>default</key> <string>Open</string> </dict> </dict> </array>
并在代码中设置它:
- (void)applicationWillFinishLaunching:(NSNotification *)notification { [NSApp setServicesProvider:self]; } - (void)openService:(NSPasteboard *)serviceBoard userData:(Nsstring *)userData error:(Nsstring **)error { }
需要注意的是,NSService粘贴板不是NSDragPboard粘贴板.
但它们都是共享的,所以我们可以访问我们想要的那个:
NSPasteboard *dragPboard = [NSPasteboard pasteboardWithName:NSDragPboard]; if ([[dragPboard types] containsObject:NSFilesPromisePboardType]) { }
下一个问题是我们没有 – [NSDraggingInfo namesOfPromisedFilesDroppedAtDestination:].
#import <applicationservices/applicationservices.h>
好老碳让我们得到了保障.
PasteboardRef pboardRef = NULL; PasteboardCreate((__bridge CFStringRef)NSDragPboard,&pboardRef); PasteboardSetPasteLocation(pboardRef,(__bridge CFURLRef)temporaryDirectory); Nsstring *urlString = [dragPboard stringForType:(Nsstring *)kPasteboardTypeFileURLPromise]; CFRelease(pboardRef);
像这里的任何其他承诺文件一样处理.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。