2012-10-05 8 views
5

Ich benutze ein WebView im Bearbeitungsmodus. Ich habe diese Methode von WebUIDelegate Procotol implementiert:Drag & Drop von Finder zu WebView

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

und es verwenden, um die Tropfen von Elementen auf meine WebView zu fangen. Wenn ich eine Datei finde, die von außerhalb meiner App gezogen wird und ein Bild enthält, erstelle ich mit dieser Methode das img-DOM-Element und füge es meinem Dokument hinzu.

Das funktioniert gut, aber wie der Name der Methode impliziert, bin ich nur informiert, dass der Widerstand passieren wird, und ich habe keine Kontrolle darüber.

Da der Finder immer den Datei-Drag-Vorgang ausführt, was normalerweise passiert, wenn eine Datei in einem WebView im Bearbeitungsmodus abgelegt wird, zeigt der Webview den Pfad der Datei an.

Ich habe am Ende die Datei Pfad Zeichenfolge zu meinem Webview hinzugefügt, und das Bild auch, aber ich möchte verhindern, dass der Text hinzugefügt wird.

Gibt es eine Möglichkeit, dies zu konfigurieren, ohne Webview Subclassing?

Ich habe es versucht und während es funktioniert, bricht es viele andere Dinge wie Caret für den Tropfen und dergleichen bewegen.

Antwort

10

Ich selbst antworten für eine Änderung!

- (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]; 


} 

Eigentlich, was ich tat, war in der Tat die WebView Unterklasse und die performDragOperation abfangen, den Inhalt der Schleppe Pappe zu ändern, wenn die Ziehen Quelle außerhalb meiner app ist und enthält nicht bereits ein Bild, sondern nur ein Dateiname

3

Ich stieß auf das gleiche Problem.

Was ich fand, ist, dass die Unterklasse der Ansicht der beste Ort für das Einfügen der Bilddaten in die Montage ist. Hier ist, wie ich es für mehrere Dateien tue:

- (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]; 
} 

Was mir aufgefallen ist die folgende Sequenz:
1. WebView fängt Drag-Operation.
2. Interne WebCore erstellte Dokument Fragment
3. Knoten in einen Delegate DOMRange eingeführt wird
4. Bearbeiten
5. Schließlich UI Delegate aufgerufen wird, wird genannt, wo es zu spät ist etwas

auch zu tun, ich schlage vor, die Einstellung folgender über den UI-Delegierten:

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

    return WebDragDestinationActionEdit; 
} 

Ok, jetzt die ISSUE ich laufe in, und ich hoffe wirklich, Sie eine Antwort für mich haben könnte. Wenn ich eine Datei auswähle, kein Problem. Wenn ich mehrere Dateien auswähle, bekomme ich sie und füge sie alle richtig in die Pasteboard ein. Selbst wenn ich zu (5) für das UIDelegate komme und das DraggingPasteboard auf seine Anzahl hin überprüfe, bekomme ich, was erwartet wird. Leider wird das Dokumentfragment nur einmal erstellt und ebenfalls nur ein Knoten eingefügt.

Haben Sie Ideen, wie Sie mehrere Fragmente erstellen, damit sie alle eingefügt werden können?

Vielen Dank im Voraus.

0

Version für die vorherigen Antworten behoben, dieser Code funktioniert für mehrere Bilder in der Webansicht gezogen.

- (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]; 
}