1

我希望能够接受来自文件、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.urlpublic.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)拖到终端停靠窗口上,它可以很好地捕捉到它。

4

2 回答 2

1

Swift 4 为您的应用程序委托

func application(_ sender: NSApplication, openFile: String) -> Bool {
    Swift.print("sender \(sender) file \(openFile)")
    return true
}

func application(_ sender: NSApplication, openFiles: [String]) {
    Swift.print("sender \(sender) list \(openFiles)")
    // Create a FileManager instance
    let fileManager = FileManager.default

    for path in openFiles {

        do {
            let files = try fileManager.contentsOfDirectory(atPath: path)
            for file in files {
                _ = self.application(sender, openFile: file)// void return
            }
        }
        catch let error as NSError {
            print("Yoink \(error.localizedDescription)")
        }
    }
}
于 2017-07-04T18:32:51.807 回答
0

如果您在 NSApplicationDelegate 中使用application:openFile:实现将文件拖动到停靠图标,那么拖动代理图标也应该可以工作。接受所有文件的诀窍是添加带有“*”扩展名的文档类型。

于 2014-04-05T06:27:38.487 回答