Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 从finder拖放到WebView_Cocoa_Webview_Drag And Drop - Fatal编程技术网

Cocoa 从finder拖放到WebView

Cocoa 从finder拖放到WebView,cocoa,webview,drag-and-drop,Cocoa,Webview,Drag And Drop,我正在编辑模式下使用WebView。我已从WebUIDelegate Procotol实现了此方法: - (void)webView:(WebView *)sender willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:(id < NSDraggingInfo >)draggingInfo -(void)webView:(webView*)发送方将对ragginginf

我正在编辑模式下使用WebView。我已从WebUIDelegate Procotol实现了此方法:

- (void)webView:(WebView *)sender willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:(id < NSDraggingInfo >)draggingInfo
-(void)webView:(webView*)发送方将对ragginginfo:(id)draggingInfo执行raggingaction:(webdragdestationaction)操作
并使用它捕捉我的WebView上的元素滴。当我检测到一个文件被从我的应用程序外部拖出并包含图片时,我在这个方法中构建imgdom元素并将其添加到我的文档中

这很好,但正如该方法的名称所暗示的,我只被告知将发生拖动,我无法控制它

由于Finder总是执行文件拖动操作,在编辑模式下将文件拖放到WebView时通常会发生的情况是WebView显示文件的路径

最后,我将文件路径字符串添加到我的webview中,并将图像添加到webview中,但我希望阻止添加文本

有没有办法在不子类化webview的情况下进行配置


我试过了,虽然它有效,但它会打断很多其他的事情,比如插入符号移动以便落下等等。

我自己回答这个问题,换换口味

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


}
-(BOOL)性能跟踪操作:(id)发送方
{
if([sender draggingSource]==nil)
{
NSPasteboard*pboard=[发送方拖动粘贴板];
if([[pboard types]包含对象:NSFilenamesPboardType]){
NSURL*文件URL;
fileURL=[NSURL URLFromPasteboard:[发件人拖动PasteBoard]];
NSArray*dragTypes=[NSArray arrayWithObject:NSFileContentsBoardType];
[[sender draggingPasteboard]declareTypes:dragTypes所有者:无];
NSImage*content=[[NSImage alloc]initWithContentsOfURL:fileURL];
[[sender draggingPasteboard]setData:[content-TIFFRepresentation]forType:NSPasteboardTypeTIFF];
}
}
返回[超级performDragOperation:发送方];
}

实际上,如果拖动源在我的应用程序之外,并且不包含图像,而只包含文件名,我所做的就是将WebView子类化并截取performDragOperation以更改拖动粘贴板的内容。

我遇到了同样的问题

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

- (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];
}
-(BOOL)性能跟踪操作:(id)发送方{
if([sender draggingSource]==nil){
NSPasteboard*pboard=[发送方拖动粘贴板];
NSArray*类=@[[NSURL类]];
NSDictionary*选项=@{NSPasteboardURLReadingFileURLsOnlyKey:[NSNumber numberWithBool:YES],
NSPasteBoardUrlReadingContentsInformToTypeskey:[NSImage imageTypes]};
NSArray*fileurl=[pboard readobjectsforlasses:classes-options:options];
如果(文件URL){
NSMutableArray*图像=[NSMutableArray阵列容量:[文件URL计数]];
for(文件URL中的NSURL*文件URL)
[images addObject:[[NSImage alloc]initWithContentsOfURL:fileURL]];
[pboard declareTypes:[NSImage imageTypes]所有者:无];
[pboard ClearContent];[pboard WriteObject:图像];
}
}返回[超级performDragOperation:发送方];
}
我注意到的是以下顺序:
1.WebView捕获拖动操作。
2.内部WebCore创建的文档片段
3.节点被插入到DOMRange中
4.编辑委托被称为
5.最后,在已经太晚无法执行任何操作的情况下调用UI委托

此外,我建议通过UI委托设置以下内容:

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

    return WebDragDestinationActionEdit;
}
-(NSUInteger)webView:(webView*)webView DragDestinationMaskForDraggingInfo:(id)DragginInfo{
返回WebDragDestinationEdit;
}
好的,现在我遇到的问题,我真的希望你能给我一个答案。当我选择一个文件时,没有问题。当我选择多个文件时,我会获取它们并将它们正确地添加到粘贴板中。即使当我找到UIDelegate的(5)并检查DragingPasteBoard的计数时,我也得到了预期的结果。但不幸的是,文档片段只创建了一次,同样,只插入了一个节点

有没有办法创建多个片段,以便插入所有片段


提前感谢。

修复了以前的回复版本,此代码适用于在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];
}
-(BOOL)性能跟踪操作:(id)发送方
{
if([sender draggingSource]==nil)
{
NSPasteboard*pboard=[发送方拖动粘贴板];
NSArray*类=@[[NSURL类]];
NSDictionary*选项=@{NSPasteboardURLReadingFileURLsOnlyKey:[NSNumber numberWithBool:YES],
NSPasteBoardUrlReadingContentsInformToTypeskey:[NSImage imageTypes]};
NSArray*fileurl=[pboard readobjectsforlasses:classes-options:options];
如果(文件URL)
{   
NSArray*文件名=[pboard propertyListForType:NSFilenamesPboardType];
NSMutableString*html=[NSMutableString];
for(文件名中的NSString*文件名){
[html appendFormat:@”“[[[NSURL alloc]initFileURLWithPath:filename]绝对字符串]];
}
[pboard declareTypes:[NSArray arraywhithobject:nshtmlboardtype]所有者:self];
[pboard setString:html forType:NSHTMLPboardType];
}
}返回[超级performDragOperation:发送方];
}