【问题标题】:Dropping files onto the app's dock icon works except for proxy icons将文件拖放到应用程序的 Dock 图标上除了代理图标外有效
【发布时间】: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


【解决方案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)")
        }
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 2016-02-20
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多