2012-10-05 32 views
5

Tôi đang sử dụng WebView ở chế độ chỉnh sửa. Tôi đã triển khai phương pháp này từ WebUIDelegate Procotol:Kéo và thả từ công cụ tìm đến WebView

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

và sử dụng nó để nắm bắt các phần tử trên WebView của tôi. Khi tôi phát hiện một tệp đang được kéo từ bên ngoài ứng dụng của tôi và chứa một hình ảnh, tôi xây dựng trong phương thức này phần tử DOM img và thêm nó vào tài liệu của tôi.

Điều này hoạt động tốt, nhưng như tên của phương pháp ngụ ý, tôi chỉ được thông báo rằng việc kéo sẽ xảy ra và tôi không kiểm soát được nó.

Khi Trình tìm kiếm luôn thực hiện thao tác kéo tệp, điều thường xảy ra khi thả tệp trên WebView trong chế độ chỉnh sửa là chế độ xem web hiển thị đường dẫn của tệp.

Tôi cuối cùng cũng có chuỗi đường dẫn tệp được thêm vào chế độ xem web của tôi và hình ảnh, nhưng tôi muốn ngăn văn bản được thêm vào.

Có cách nào để định cấu hình điều này mà không có phân lớp trên web?

Tôi đã thử nó và trong khi nó hoạt động, nó phá vỡ rất nhiều thứ khác như caret di chuyển cho thả và như vậy.

Trả lời

10

Trả lời bản thân này để thay đổi!

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


} 

Trên thực tế, những gì tôi đã làm là thực sự để phân lớp các WebView và đánh chặn các performDragOperation để thay đổi nội dung của các tông kéo, nếu nguồn kéo nằm ngoài ứng dụng của tôi và không chứa một hình ảnh nhưng chỉ tên tệp.

3

Tôi đã gặp sự cố tương tự.

Điều tôi thấy là việc phân lớp chế độ xem là nơi tốt nhất để chèn dữ liệu hình ảnh vào trong bảng. Đây là cách tôi đang làm nó cho nhiều file:

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

Những gì tôi nhận thấy là trình tự sau đây:
1. WebView chụp hoạt động kéo.
2. Internal WebCore tạo đoạn văn bản
3. Node được đưa vào một DOMRange
4. Biên tập đại biểu là gọi
5. Cuối cùng UI đại biểu là gọi nơi đó là quá muộn để làm bất cứ điều gì

Ngoài ra, Tôi khuyên bạn nên đặt thông tin sau thông qua Giao diện người dùng:

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

    return WebDragDestinationActionEdit; 
} 

Ok, bây giờ là ISSUE Tôi đang tham gia và tôi thực sự hy vọng bạn có thể có câu trả lời cho tôi. Khi tôi chọn một tập tin không có vấn đề gì. Khi tôi chọn nhiều tập tin, tôi nhận được chúng và thêm tất cả chúng vào trong bảng. Ngay cả khi tôi nhận được (5) cho UIDelegate và kiểm tra draggingPasteboard cho số của nó, tôi nhận được những gì được mong đợi. Nhưng tiếc là đoạn tài liệu chỉ được tạo một lần và tương tự như vậy chỉ có một nút được chèn vào.

Bất kỳ ý tưởng nào về cách tạo nhiều phân đoạn để chúng có thể được chèn vào tất cả?

Cảm ơn bạn trước.

0

Phiên bản cố định cho các câu trả lời trước đó, mã này hoạt động cho nhiều hình ảnh được kéo trong chế độ xem 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]; 
} 
Các vấn đề liên quan