2014-02-08 44 views
0

我希望能够接受来自文件,网址和文本的应用程序停靠栏图标上的拖放。由于文件(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,Terminal,Preview和一些第三方应用中删除代理图标:没有人会调用我的服务方法。但奇怪的是,从Finder中删除的代理图标运行良好。

我试着将public.url更改为public.item(物理层次结构的基本类型),但我的方法仍然没有为非Finder代理图标调用。

当搜索成功地滴在我的应用程序的代理图标时,pboard -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)拖到终端停靠窗口上,并且它可以捕捉到这一点。

+0

什么是代理图标? –

+0

El Tomato:https://developer.apple.com/library/mac/documentation/userexperience/conceptual/applehiguidelines/art/wn_standardwindowparts_2x.png – user3277676

+0

您是否设法找到针对此问题的解决方案? – iphaaw

回答

0

如果您在NSApplicationDelegate中使用application:openFile:实现将文件拖动到停靠栏图标,则拖动代理图标也应该起作用。接受所有文件的技巧是添加一个带有'*'扩展名的文档类型。

0

斯威夫特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)") 
     } 
    } 
} 
相关问题