私は個人的にNSFileWrapperの設計を軽蔑していますが、各添付ファイルのデータが必要な場合は、NSFileWrapperのregularFileContents
メソッドを介してNSDataインスタンスとしてアクセスできます。ただし、アプリケーションの添付ファイルへの有効で明示的なパス名が必要でした。それを取得するには、本来よりもはるかに多くの作業が必要です。
NSTextViewをサブクラス化し、NSDraggingDestination ProtocolメソッドをオーバーライドしたりdraggingEntered:
、ドラッグ操作中にアプリケーションに渡されたNSPasteboardItemオブジェクトをトラバースしたりできます。NSFileWrapperが参照ファイルのiノードを提供できるため、パス名とそのiノード番号をNSMutableDictionaryに保持することを選択しました。後で、NSAttributedStringを介してNSTextViewのコンテンツにアクセスすると、iノードをインデックスとして使用して添付ファイルのパス名を取得できます。
- (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];
}
アプリケーションに影響を与えない私のソリューションの問題の1つは、同じファイルへのハードリンクであるビューにドラッグされた複数のファイル(単独または一緒に)が、ディクショナリに追加された最後のパス名としてのみインデックス付けされることです。 iノードを共有します。アプリケーションでパス名がどのように使用されているかによっては、これが問題になる可能性があります。