5

リッチテキストとグラフィックを有効にした基本的な NSTextView があります (IB)。取得したいのは、ドラッグされた画像のパスとファイル名で、それらを別のクラスに渡すことができます。

私は NSAttributedString を初めて使用しますが、検索を使用してループがenumerateAttributesInRange:options:usingBlock:ありNSAttachmentAttributeName、すべて正常に機能しています。しかし、さらに深く行くと、fileWrapper クラスにたどり着き、 item のパスを明らかにできないようです

NSTextAttachment の名前とパスを取得するにはどうすればよいですか?

関連:それらすべてを取得して属性をステップスルーする簡単な方法はありますか?

どうもありがとう!

4

1 に答える 1

7

私は個人的に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ノードを共有します。アプリケーションでパス名がどのように使用されているかによっては、これが問題になる可能性があります。

于 2012-02-16T00:29:11.157 に答える