我希望能够接受来自文件、URL 和文本的应用程序停靠图标上的拖放。由于文件 (public.file-url) 是 URL (public.url) 的子类型,因此我只在 Info.plist 中添加了两个服务条目:
Services
Item 0 (processURL)
Instance method Name = processURL
Send Types
Item 0 = public.url
Menu
Menu item title = Process URL
Item 1 (processString)
Instance method Name = processString
Send Types
Item 0 = public.plain-text
Menu
Menu item title = Process Text
然后我-applicationDidFinishLaunching
打电话,并在我的应用程序委托中[NSApp setServicesProvider: self]
编写了几个方法(-processString:userData:error
和)。-processURL:userData:error
应用程序图标现在接受所有三种类型的水滴。在该-processURL:...
方法中,很容易检查它是否是本地文件,以便处理这两种情况。
但是,我仍然无法解决一个案例。当我尝试将窗口的代理图标拖动到应用程序时,它会突出显示该图标,就好像它可以接受拖放一样,但是我的方法没有被调用。
我尝试从 Xcode、终端、预览和一些第三方应用程序中删除代理图标:没有一个会调用我的服务方法。但奇怪的是,从 Finder 中删除的代理图标效果很好。
我尝试更改public.url
为public.item
(物理层次结构的基本类型),但是对于非 Finder 代理图标仍然没有调用我的方法。
当 Finder 在我的应用程序上成功放置代理图标时,-types
它提供的面板是:
- "public.file-url",
- "CorePasteboardFlavorType 0x6675726C",
- “dyn.ah62d4rv4gu8y6y4grf0gn5xbrzw1gydcr7u1e3cytf2gn”,
- NSFilenamesPboardType,
- “dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu”,
- “Apple URL 粘贴板类型”
我尝试将这些中的每一个直接用作“发送类型”。“public.file-url”和“NSFilenamesPboardType”突出显示图标,好像它会接受丢弃,但不要。不出所料,其他人甚至没有突出显示停靠图标。
我找不到对 UTI 与普通文件不同的代理图标的任何引用。他们有吗?那会很奇怪。
我知道这一定是可能的,因为我可以将代理图标从任何窗口拖到终端窗口上。我错过了什么?
更新:从 NSView 中,如果我-registerForDraggedTypes
包含“public.url”,我确实会从所有应用程序中获得代理图标,其-types
列表与上面列出的 Finder 中的列表完全相同。因此,通过停靠图标接收掉落显然是特别的。这应该仍然可以通过某种方式实现:您可以将代理图标从(非 Finder)窗口(例如,来自 Xcode 的 .xcworkspace)拖到终端停靠窗口上,它可以很好地捕捉到它。