将邮件拖放到OS X应用程序中

Adr*_*ana 2 macos drag-and-drop objective-c

我希望能够从Outlook for Mac和Mail.app拖放和发送电子邮件到OS X应用程序.如果我从我的查找器中拖放并发送电子邮件(拖动文件),则会调用以下内容:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
Run Code Online (Sandbox Code Playgroud)

但是,如果我从Outlook for Mac或Mail.app拖放,则不会调用该方法.我有点失落,我怎么能实现这一目标.有任何想法吗?

bda*_*ash 8

拖动目的地部分拖放编程主题:

要接收拖动操作,必须通过向对象发送在NSWindow和NSView中定义的registerForDraggedTypes:消息来注册窗口或视图将接受的粘贴板类型,并从NSDraggingDestination协议实现多个方法.在拖动会话期间,仅当目标是针对与被拖动的粘贴板数据的类型匹配的粘贴板类型注册时,候选目标才接收NSDraggingDestination消息.当图像进入,在内部移动,然后在目的地边界内退出或释放时,目的地接收这些消息.

为了接受来自Mail的拖拽,您需要知道要注册的粘贴板类型.您可以使用ClipboardViewer来发现拖动粘贴板上的Mail放置的数据类型(可在最近版本的Xcode 的Auxiliary Tools包中找到).启动ClipboardViewer并从工具栏中的组合框中选择"拖动剪贴板".切换回Mail并短暂拖动一条消息,然后返回到ClipboardViewer.您应该会在侧栏中看到许多粘贴板类型.特别感兴趣的是public.urlcom.apple.pasteboard.promised-file-content-type类型.前者表示URL位于粘贴板上.后者是文件承诺在粘贴板上.URL往往是一个很好的起点,但在这种特殊情况下,我们可以看到URL不像文件URL那样有用,它是一个相当不透明的消息URL.这意味着我们需要处理的文件,而不是承诺,所以我们的配置以获得拖动的时候,我们应该呼吁registerForDraggedTypes:NSFilesPromisePboardType.

Dragging File Promises文档的第二部分具体说明了如何处理接收promise.总而言之,您-namesOfPromisedFilesDroppedAtDestination:从内部调用拖动的发送者,performDragOperation:让他们将拖动的数据写入您选择的位置(例如,履行承诺).在AppKit调用concludeDragOperation:对象之前,拖动的发起者会将数据写入磁盘.在任何时候,concludeDragOperation:您都可以从磁盘加载已删除的文件并根据需要进行处理.