5

Tôi có NSTextView cơ bản với văn bản và đồ họa đa dạng được bật (trong IB). Những gì tôi muốn nhận được là đường dẫn và tên tệp của bất kỳ hình ảnh nào được kéo vào để tôi có thể chuyển những hình ảnh đó đến lớp khác.Lấy tên tệp và đường dẫn từ nsfilewrapper/nstextattachment trong NSAttributedString

Tôi mới sử dụng NSAttributedString nhưng tôi có vòng lặp sử dụng enumerateAttributesInRange:options:usingBlock: tìm kiếm NSAttachmentAttributeName và tất cả đều hoạt động tốt. Nhưng đi sâu hơn, tôi vào lớp fileWrapper và nó là apparent inability to give me the path of the item.

Tôi làm cách nào để biết tên và đường dẫn của NSTextAttachment?

Có liên quan: Có cách nào dễ dàng hơn để có được tất cả chúng sau đó bước qua các thuộc tính không?

Cảm ơn nhiều!

+0

Thật không may, từ điển thuộc tính được NSFileWrapper trả về cũng không cung cấp tên đường dẫn đầy đủ. Thiết kế của NSFileWrapper làm cho các giả định đóng gói cận thị và không may bằng cách từ chối cung cấp quyền truy cập vào tên đường dẫn của đối tượng tham chiếu gốc. – ctpenrose

Trả lời

8

Trong khi cá nhân tôi giữ thiết kế NSFileWrapper trong sự khinh miệt, nếu bạn chỉ cần dữ liệu của mỗi tệp đính kèm, bạn có thể truy cập nó dưới dạng một cá thể NSData thông qua phương thức regularFileContents của NSFileWrapper. Tuy nhiên, tôi cần một tên đường dẫn hợp lệ và rõ ràng cho tệp đính kèm cho ứng dụng của mình. Để có được nhiều công việc hơn là:

Bạn có thể phân lớp NSTextView và ghi đè phương thức Giao thức NSDraggingDestination draggingEntered: và bạn có thể duyệt các đối tượng NSPasteboardItem được chuyển đến ứng dụng của bạn trong quá trình kéo. Tôi đã chọn giữ tên đường dẫn và số inode của nó trong NSMutableDictionary, vì NSFileWrapper có thể cung cấp cho bạn inode của tệp được tham chiếu. Sau đó, khi tôi truy cập nội dung NSTextView thông qua NSAttributedString, tôi có thể tìm nạp tên đường dẫn của tệp đính kèm bằng cách sử dụng inode làm chỉ mục.

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 

    // get pasteboard from dragging operation 

    NSPasteboard *pasteboard = [sender draggingPasteboard]; 

    NSArray *pasteboardItems = [pasteboard pasteboardItems]; 

    for (NSPasteboardItem *pasteboardItem in pasteboardItems) { 

     // look for a file url type from the pasteboard item 

     NSString *draggedURLString = [pasteboardItem stringForType:@"public.file-url"]; 

     if (draggedURLString != nil) { 

      NSURL *draggedURL = [NSURL URLWithString:draggedURLString]; 

      NSString *draggedPath = [draggedURL path]; 

      NSLog(@"pathname: %@", draggedPath); 

      // do something with the path 

      // get file attributes 

      NSDictionary *draggedAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:draggedPath error:nil]; 

      if (draggedAttributes == nil) 
       continue; 

      // the NSFileWrapper allows access to the absolute file via NSFileSystemFileNumber 
      // put the path and the inode (returned as an NSNumber) into a NSMutableDictionary 

      NSNumber *draggedInode = [draggedAttributes objectForKey:NSFileSystemFileNumber]; 

      [draggedFiles setObject:draggedPath forKey:draggedInode]; 
     } 

    } 

    return [super draggingEntered:sender]; 
} 

Một vấn đề với giải pháp của tôi, điều đó không ảnh hưởng đến ứng dụng của tôi, đó là nhiều file kéo vào xem (hoặc đơn lẻ hoặc với nhau) mà là liên kết cứng đến cùng một tập tin, sẽ chỉ được lập chỉ mục như tên đường dẫn cuối được thêm vào từ điển chia sẻ inode. Tùy thuộc vào cách các tên đường dẫn được sử dụng bởi ứng dụng của bạn, điều này có thể là một vấn đề.

+0

Tuyệt vời, nhưng tiếc quá. Khi điều tra điều này, tôi cho rằng việc kéo Enter là nơi tôi đang đứng đầu nhưng vẫn chưa đặt mã xuống. Tôi sẽ thử ví dụ của bạn trong vài ngày tới và cho bạn biết. Cảm ơn! –

+0

Điều này xuất hiện cách duy nhất để thực hiện. Cảm ơn các ví dụ mã - đó là nơi tôi cần phải đi. Đã chấp nhận câu trả lời này. –

Các vấn đề liên quan