5

編集モードでWebViewを使用しています。私はWebUIDelegateProcotolからこのメソッドを実装しました:

- (void)webView:(WebView *)sender willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:(id < NSDraggingInfo >)draggingInfo

それを使用して、WebView上の要素のドロップをキャッチします。アプリの外部からドラッグされ、画像を含むファイルを検出したら、このメソッドでimg DOM要素を作成し、ドキュメントに追加します。

これは問題なく機能しますが、メソッドの名前が示すように、ドラッグが発生することだけが通知され、それを制御することはできません。

Finderは常にファイルのドラッグ操作を行うため、編集モードでWebViewにファイルをドロップすると、通常はWebViewにファイルのパスが表示されます。

最終的にファイルパス文字列がWebビューに追加され、画像も追加されますが、テキストが追加されないようにしたいと思います。

Webビューをサブクラス化せずにこれを構成する方法はありますか?

私はそれを試しました、そしてそれが機能している間、それはドロップのために動くカレットのような他の多くのものを壊します。

4

3 に答える 3

10

変化のためにこれに自分で答える!

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{

    if ([sender draggingSource] == nil)
    {

        NSPasteboard *pboard = [sender draggingPasteboard];

        if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
            NSURL* fileURL;
            fileURL=[NSURL URLFromPasteboard: [sender draggingPasteboard]];

            NSArray *dragTypes = [NSArray arrayWithObject:NSFileContentsPboardType];
            [[sender draggingPasteboard] declareTypes:dragTypes owner:nil];

            NSImage *content = [[NSImage alloc] initWithContentsOfURL:fileURL];
            [[sender draggingPasteboard] setData:[content TIFFRepresentation] forType:NSPasteboardTypeTIFF];
        }
    }

    return [super performDragOperation:sender];


}

実際、ドラッグソースがアプリの外部にあり、画像がまだ含まれておらず、ファイル名のみが含まれている場合、実際にWebViewをサブクラス化し、performDragOperationをインターセプトしてドラッグペーストボードのコンテンツを変更しました。

于 2012-10-05T14:06:47.040 に答える
3

私は同じ問題に遭遇しました。

私が見つけたのは、ビューをサブクラス化することが、画像データをペーストボードに挿入するのに最適な場所であるということです。これが私が複数のファイルに対してそれを行う方法です:

- (BOOL) performDragOperation:(id<NSDraggingInfo>)sender {

    if ( [sender draggingSource] == nil ) {

        NSPasteboard *pboard = [sender draggingPasteboard];

        NSArray *classes = @[ [NSURL class] ];
        NSDictionary *options = @{ NSPasteboardURLReadingFileURLsOnlyKey: [NSNumber numberWithBool:YES],
                                   NSPasteboardURLReadingContentsConformToTypesKey: [NSImage imageTypes] };

        NSArray *fileURLs = [pboard readObjectsForClasses:classes options:options];

        if ( fileURLs ) {

            NSMutableArray *images = [NSMutableArray arrayWithCapacity:[fileURLs count]];

            for ( NSURL *fileURL in fileURLs )
                [images addObject:[[NSImage alloc] initWithContentsOfURL:fileURL]];

            [pboard declareTypes:[NSImage imageTypes] owner:nil];
            [pboard clearContents]; [pboard writeObjects:images];           
        }

    } return [super performDragOperation:sender];
}

私が気付いたのは、次のシーケンス
です。1.WebViewはドラッグ操作をキャプチャします。
2.内部WebCoreで作成されたドキュメントフラグメント
3.ノードがDOMRangeに挿入されます
4.編集デリゲートが呼び出され
ます5.最後にUIデリゲートが呼び出され、遅すぎて何もできません

また、UIデリゲートを介して次のように設定することをお勧めします。

- (NSUInteger) webView:(WebView *)webView dragDestinationActionMaskForDraggingInfo:(id <NSDraggingInfo>)draggingInfo {

    return WebDragDestinationActionEdit;
}

さて、今私が直面している問題です。あなたが私に答えてくれることを本当に願っています。1つのファイルを選択しても問題ありません。複数のファイルを選択すると、それらを取得して、すべてを適切にペーストボードに追加します。UIDelegateの(5)に到達し、draggingPasteboardのカウントを調べても、期待どおりの結果が得られます。ただし、残念ながら、ドキュメントフラグメントは一度だけ作成され、同様に1つのノードのみが挿入されます。

複数のフラグメントを作成して、それらをすべて挿入できるようにする方法はありますか?

前もって感謝します。

于 2013-03-04T22:18:20.680 に答える
0

以前の返信の修正バージョン。このコードは、Webビューにドラッグされた複数の画像に対して機能します。

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender
{
    if ( [sender draggingSource] == nil )
    {
        NSPasteboard *pboard = [sender draggingPasteboard];
        NSArray *classes = @[ [NSURL class] ];
        NSDictionary *options = @{ NSPasteboardURLReadingFileURLsOnlyKey: [NSNumber numberWithBool:YES],
                                   NSPasteboardURLReadingContentsConformToTypesKey: [NSImage imageTypes] };
        NSArray *fileURLs = [pboard readObjectsForClasses:classes options:options];

        if(fileURLs)
        {   
            NSArray* filenames = [pboard propertyListForType: NSFilenamesPboardType];
            NSMutableString* html = [NSMutableString string];

            for(NSString* filename in filenames) {
                [html appendFormat: @"<img src=\"%@\"/>", [[[NSURL alloc] initFileURLWithPath: filename] absoluteString]];
            }

            [pboard declareTypes: [NSArray arrayWithObject: NSHTMLPboardType] owner: self];
            [pboard setString: html forType: NSHTMLPboardType];
        }

    } return [super performDragOperation:sender];
}
于 2013-11-05T12:14:57.230 に答える