首页 文章

从finder拖放到WebView

提问于
浏览
5

我在编辑模式下使用WebView . 我已经从WebUIDelegate Procotol实现了这个方法:

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

并使用它来捕获我的WebView上的元素滴 . 当我检测到从我的应用程序外部拖动文件并包含图片时,我在此方法中构建了img DOM元素并将其添加到我的文档中 .

这工作正常,但正如方法的名称所暗示的那样,我只被告知拖动会发生,我无法控制它 .

由于Finder始终执行文件拖动操作,因此在编辑模式下在WebView上删除文件时通常会发生的事情是webview显示文件的路径 .

我最终将文件路径字符串添加到我的webview和图像中,但我想阻止添加文本 .

有没有办法在没有子类化webview的情况下配置它?

我尝试了它,当它工作时,它打破了许多其他的东西,如插入移动的插入等 .

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以更改拖动粘贴板的内容,如果拖动源位于我的应用程序之外并且不包含图像但只包含文件名 .

  • 0

    我遇到了同样的问题 .

    我发现,将视图子类化是将图像数据插入到粘贴板中的最佳位置 . 以下是我为多个文件执行的操作:

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

    好的,现在我遇到的问题,我真的希望你能找到答案 . 当我选择一个文件没问题 . 当我选择多个文件时,我会得到它们并将它们全部添加到粘贴板中 . 即使我到达(5)UIDelegate并检查draggingPasteboard的计数,我也得到了预期的结果 . 但不幸的是,文档片段只被创建一次,同样只插入一个节点 .

    任何想法如何创建多个片段,以便它们都可以插入?

    先感谢您 .

  • 3

    修复了以前回复的版本,此代码适用于在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];
    }
    

相关问题