2012-10-05 7 views
5

私は編集モードでWebViewを使用しています。ファインダからWebViewにドラッグアンドドロップ

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

を、私のWebViewの上の要素の滴をキャッチするためにそれを使用する:私はWebUIDelegate Procotolからこのメソッドを実装しています。私のアプリケーションの外からドラッグされたファイルを検出し、画像を含んでいる場合は、このメソッドでimg DOM要素を作成し、それをドキュメントに追加します。

これはうまくいきますが、メソッドの名前が示すように、ドラッグが行われることのみが通知されており、コントロールできません。

Finderは常にファイルドラッグ操作を実行するので、編集モードでWebViewにファイルをドロップすると、WebViewはファイルのパスを表示します。

ファイルパス文字列が私のwebviewに追加されてしまいましたが、画像もありますが、テキストが追加されないようにしたいと思います。

webviewをサブクラス化せずにこれを設定する方法はありますか?

私はそれを試してみましたが、動作している間に、ドロップなどのために移動するキャレットのような多くのものが壊れています。

答えて

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を傍受する確かでしたファイル名

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は、また、何に

を行うには遅すぎるところと呼ばれる
5.最後にUIの委任と呼ばれる
3.ノードがDOMRange
4.編集の委任に挿入されたドキュメントフラグメントを作成しました

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

    return WebDragDestinationActionEdit; 
} 

[OK]を、今の問題は、私はに実行していると私は本当にあなたが私のための答えを持っているかもしれません願っています:私は、UIの委任を経由して、次の設定をお勧めします。 1つのファイルを選択しても何の問題もありません。複数のファイルを選択すると、それらを取得して、すべてを適切にペーストボードに追加します。私がUIDelegateのために(5)に達しても、そのカウントのためにドラッグペーストボードを検査しても、私は期待されるものを得る。しかし残念なことに、ドキュメントフラグメントは一度しか作成されず、同様に1つのノードだけが挿入されます。

複数のフラグメントを作成してすべて挿入できるようにするにはどうすればよいですか?

ありがとうございます。

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]; 
} 
関連する問題