NSOutlineViewDataSource
Finder へのドラッグ時にファイル システムに存在しないディレクトリをドラッグできるようにするには、どのように実装しますか? 私は大量のドキュメントを検索して検索して読みましたが、機能する価値のあるものを見つけるのに非常に苦労しました。ファイル システムのようなツリーを管理するカスタム データ ソースを使用します。すべてのアイテムは、そのパスを追跡するクラスのインスタンスです。ファイルとディレクトリをアウトライン ビューから Finder にドラッグできるようにしたいと考えています。
私は持っている:
- (BOOL)outlineView:(NSOutlineView *)outlineView
writeItems:(NSArray *)items
toPasteboard:(NSPasteboard *)pasteboard
{
NSMutableArray *types = [NSMutableArray array];
for (JOItemInfo *itemInfo in items) {
NSString *extension = itemInfo.name.pathExtension;
if (extension.length > 0) [types addObject:extension];
}
[pasteboard declareTypes:@[(__bridge_transfer NSString *)kPasteboardTypeFileURLPromise]
owner:self];
[pasteboard setPropertyList:types
forType:(__bridge_transfer NSString *)kPasteboardTypeFileURLPromise];
DDLogInfo(@"Wrote types %@ to pasteboard %@ for key %@",
types,
pasteboard,
(__bridge_transfer NSString *)kPasteboardTypeFileURLPromise);
return YES;
}
その実装は、指定さ-outlineView:namesOfPromisedFilesDroppedAtDestination:forDraggedItems:
れたパス内にアイテムを書き込みます。これは、項目を Finder にドラッグできるという点で機能しますが、離すと他に何も起こら-...namesOfPromisedFilesDropped...
ず、メソッドも呼び出されません。また、
[self.outlineView setDraggingDestinationFeedbackStyle:NSTableViewDraggingDestinationFeedbackStyleRegular];
[self.outlineView setDraggingSourceOperationMask:NSDragOperationNone forLocal:YES];
[self.outlineView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];
は私の中にあり-awakeFromNib
ます。はif (extension.length > 0) ...
どこかで見つけた例に基づいていましたが、日付が付けられており、ドキュメントには拡張子を返すと書かれているので、それは適切だと思います。個人的には、特にNSOutlineView
. ありがとう!