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 đề.
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