2

Outlook for Mac および Mail.app から OS X アプリにドラッグ アンド ドロップして電子メールを送信できるようにしたいと考えています。ファインダーからドラッグ アンド ドロップしてメールを送信する (ファイルをドラッグする) と、次のように呼び出されます。

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender

ただし、Outlook for Mac または Mail.app からドラッグ アンド ドロップすると、メソッドは呼び出されません。どうすればこれを達成できるか、少し迷っています。何か案は?

4

2 に答える 2

8

Drag and Drop Programming TopicsDragging Destinations 部分から:

ドラッグ操作を受け取るには、NSWindow と NSView の両方で定義された registerForDraggedTypes: メッセージをオブジェクトに送信して、ウィンドウまたはビューが受け入れるペーストボード タイプを登録し、NSDraggingDestination プロトコルからいくつかのメソッドを実装する必要があります。ドラッグ セッション中、候補の宛先は、ドラッグされるペーストボード データのタイプと一致するペーストボード タイプに宛先が登録されている場合にのみ、NSDraggingDestination メッセージを受け取ります。宛先は、イメージが入り、内部を移動し、宛先の境界内で終了または解放されると、これらのメッセージを受け取ります。

メールからのドラッグを受け入れるには、登録するペーストボードの種類を知る必要があります。ClipboardViewer を使用して、Mail がドラッグ ペーストボードに配置するデータの種類を確認できます ( Xcode の最近のバージョンのAuxiliary Tools パッケージで利用可能)。ClipboardViewer を起動し、ツールバーのコンボ ボックスから [クリップボードをドラッグ] を選択します。Mail に戻り、メッセージを少しの間ドラッグしてから、ClipboardViewer に戻ります。サイドバーに多数のペーストボード タイプが表示されます。特に興味深いのはpublic.urlcom.apple.pasteboard.promised-file-content-type型です。前者は URL がペーストボード上にあることを示します。ファイルが約束する後者台紙にあります。URL は開始するのに適した場所になる傾向がありますが、この特定のケースでは、URL がファイル URL のような有用なものではなく、かなり不透明なメッセージ URL であることがわかります。つまり、代わりに file promise を処理する必要があるため、ドラッグを受け取るようにビューを構成するときは、 を呼び出す必要がregisterForDraggedTypes:ありNSFilesPromisePboardTypeます。

Dragging File Promisesドキュメントの 2 番目の部分では、 Promise の受信を処理する方法について具体的に概説しています。要約すると-namesOfPromisedFilesDroppedAtDestination:、ドラッグの送信者を内部から呼び出して、ドラッグさperformDragOperation:れたデータを選択した場所に書き込むようにします (たとえば、約束を果たします)。ドラッグの開始者は、AppKit がconcludeDragOperation:オブジェクトに対して呼び出す前に、データをディスクに書き込みます。フォワードからの任意の時点でconcludeDragOperation:、ドロップされたファイルをディスクからロードして、必要に応じて処理できます。

于 2013-01-19T06:02:00.603 に答える
0

しばらく苦労したので、この問題への回答を投稿すると思いました。このコードは promise を処理し、ドロップされたメールをユーザー フォルダー内の Drop Stuff というフォルダーに単純にコピーします。また、任意のファイルでも機能し、アドレス帳やリマインダーなどの他のアプリでも機能するようです。複数のファイル (またはメール メッセージ) のコピーにはまだ機能しません。

import Cocoa

class DropArea: NSImageView, NSDraggingDestination 
{

    override func drawRect(dirtyRect: NSRect) 
    {
        super.drawRect(dirtyRect)
    }

    required init?(coder: NSCoder)
    {
        let types = [NSFilenamesPboardType, NSURLPboardType, NSPasteboardTypeTIFF, NSFilesPromisePboardType]
        super.init(coder: coder)
        registerForDraggedTypes(types)
    }

    override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation
    {
        return .Copy
    }

    override func performDragOperation(sender: NSDraggingInfo) -> Bool
    {
        var error: NSError?

        var folderPath = NSHomeDirectory()+"/Drop Stuff/"
        if (!NSFileManager.defaultManager().fileExistsAtPath(folderPath))
        {
            NSFileManager.defaultManager().createDirectoryAtPath(folderPath, withIntermediateDirectories: true, attributes: nil, error: &error)
        }

        var folderURL = NSURL(fileURLWithPath: folderPath)
        var f = sender.namesOfPromisedFilesDroppedAtDestination(folderURL!)
        println("Copied to \(folderPath)")
        return true
    }
}

もちろん、このコードを改善するための提案は大歓迎です:-)

于 2015-05-19T09:19:46.850 に答える