3

ビューベースのテーブル ビューを使用して Mac アプリを作成しています。これは、ユーザーが Finder にドラッグして各画像をファイルに保存できるようにするための画像のリストです。

データ ソースは、カスタム モデル オブジェクトの配列を所有しています。モデル オブジェクトはすべてNSPasteboardWriting、次のプロトコルに準拠しています。

- (NSArray *)writableTypesForPasteboard:(NSPasteboard *)ペーストボード {
    //self.screenshotImageDataType は、CGImageSource でデータを調べることによって、画像がダウンロードされた後に設定されます。
    // この時点で正しいことを確認しました。私のテストでの値は @"public.jpeg" (kUTTypeJPEG) でした。
    return @[ self.screenshotImageDataType, (__bridge NSString *)kUTTypeURL, (__bridge NSString *)kPasteboardTypeFilePromiseContent ];
}

- (id)pasteboardPropertyListForType:(NSString *)type {
    if (UTTypeEqual((__bridge CFStringRef)type, (__bridge CFStringRef)self.screenshotImageDataType)) {
        self.screenshotImageData を返します。
    } そうでなければ (UTTypeEqual((__bridge CFStringRef)type, kUTTypeURL)) {
        return [self.screenshotImageURL pasteboardPropertyListForType:type];
    } そうでなければ (UTTypeEqual((__bridge CFStringRef)type, kPasteboardTypeFilePromiseContent)) {
        self.screenshotImageDataType を返します。
    }

    id plist = [self.screenshotImage pasteboardPropertyListForType:type]
        ?: [self.screenshotImageURL pasteboardPropertyListForType:type];
    NSLog(@"plist for type %@: %@ %p", type, [plist className], plist);
    return [self.screenshotImage pasteboardPropertyListForType:type]
        ?: [self.screenshotImageURL pasteboardPropertyListForType:type];
}

オブジェクトが所有する URL は Web URL であり、ローカル ファイルではありません。これらは、画像がダウンロードされた URL です。

テーブル ビューの data-source-and-delegate-in-one は、ファイル プロミスに関連するメソッドを実装します。

- (NSArray *)tableView:(NSTableView *)tableView
namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestinationURL
forDraggedRowsWithIndexes:(NSIndexSet *)行
{
    return [[self.screenshots objectsAtIndexes:rows] valueForKeyPath:@"screenshotImageURL.lastPathComponent"];
}

その式の値をログに記録すると、正しいファイル名拡張子を持つ有効なファイル名が生成されます。

最後にwindowDidLoad、私はこの混乱全体をオンにするメッセージを送信しました。

//Enable copy drags to non-local destinations (i.e., other apps).
[self.tableView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];

舞台は整った。幕が上がるとこうなります。

Finder が所有するウィンドウにドラッグすると、ドラッグしているビューが強調表示され、ドラッグを受け入れることが示されます。

ただし、画像をドロップしてもファイルは作成されません。

約束した内容のファイルが作成されないのはなぜですか?

4

1 に答える 1

3

NSDraggingInfoプロトコルのnamesOfPromisedFilesDroppedAtDestination:メソッドのドキュメントはヒントを提供します:

このメソッドが戻るまでに、ソースがファイルを作成している場合と作成していない場合があります。

どうやら、少なくともテーブルビューのコンテキストでは、これは「自分でファイルを作成してください、怠け者」と訳されます。

テーブル ビュー データ ソースのtableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:メソッドを修正して、ドラッグされた各モデル オブジェクトにそれ自体をファイル (宛先ディレクトリ URL + モデル オブジェクトのソース URL からのファイル名で構成される) に書き込むように指示し、その機能をモデル オブジェクト クラスに実装しました。すべてが動作するようになりました。

于 2012-10-12T04:13:55.680 に答える