我在编辑模式下使用WebView。我已经从WebUIDelegate Procotol实现了这个方法:
- (void)webView:(WebView *)sender willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:(id < NSDraggingInfo >)draggingInfo
并使用它来捕获WebView上的元素滴。当我检测到从我的应用程序外部拖动文件并包含图片时,我在此方法中构建了img DOM元素并将其添加到我的文档中。
这样可以正常工作,但正如方法名称所暗示的那样,我只会被告知拖拽会发生,我无法控制它。
由于Finder始终执行文件拖动操作,因此在编辑模式下在WebView上删除文件时通常会发生的事情是webview显示文件的路径。
我最终将文件路径字符串添加到我的webview和图像中,但我想阻止添加文本。
有没有办法在没有继承webview的情况下配置它?
我尝试了它,当它工作时,它打破了很多其他的东西,如插入移动的插入物等。
答案 0 :(得分: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以更改拖动粘贴板的内容,如果拖动源位于我的应用程序之外且不包含图像但只包含文件名。 / p>
答案 1 :(得分: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 Delegate设置以下内容:
- (NSUInteger) webView:(WebView *)webView dragDestinationActionMaskForDraggingInfo:(id <NSDraggingInfo>)draggingInfo {
return WebDragDestinationActionEdit;
}
好的,现在我遇到了问题,我真的希望你能找到答案。当我选择一个文件没问题。当我选择多个文件时,我会得到它们并将它们全部添加到粘贴板中。即使我到达(5)UIDelegate并检查draggingPasteboard的计数,我得到了预期的结果。但不幸的是,文档片段只被创建一次,同样只插入一个节点。
如何创建多个片段以便可以插入所有片段?
提前谢谢。
答案 2 :(得分: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)
{
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];
}