【发布时间】:2014-02-08 01:55:52
【问题描述】:
我希望能够接受来自文件、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 成功在我的应用上放置代理图标时,它提供的 pboard -types 是:
- "public.file-url",
- “CorePasteboardFlavorType 0x6675726C”,
- “dyn.ah62d4rv4gu8y6y4grf0gn5xbrzw1gydcr7u1e3cytf2gn”,
- NSFilenamesPboardType,
- “dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu”,
- “Apple URL 粘贴板类型”
我尝试将其中的每一个直接用作“发送类型”。 “public.file-url”和“NSFilenamesPboardType”突出显示图标,好像它会接受丢弃,但不要。不出所料,其他人甚至没有突出显示停靠图标。
我找不到任何对 UTI 与普通文件不同的代理图标的引用。他们有吗?那会很奇怪。
我知道这一定是可能的,因为我可以将代理图标从任何窗口拖到终端窗口上。我错过了什么?
更新:从 NSView 中,如果我 -registerForDraggedTypes 包括“public.url”,我会从所有应用程序中获得代理图标,与上面列出的 Finder 中的 -types 列表完全相同。因此,通过停靠图标接收掉落显然是特别的。这应该仍然可以通过某种方式实现:您可以将代理图标从(非 Finder)窗口(例如,来自 Xcode 的 .xcworkspace)拖到终端停靠窗口上,它可以很好地捕捉到它。
【问题讨论】:
-
什么是代理图标?
-
你找到解决这个问题的方法了吗?
标签: objective-c cocoa drag-and-drop dock uti