Finder に似たフォルダー ブラウザー アプリケーションを設計しています。ユーザーがアプリケーションの外部からファイルをドラッグして、アプリケーション内のフォルダーにドロップできるようにしたいと考えています。これにより、ドラッグされたアイテムがそのフォルダーに追加されます。
私のカスタムNSCollectionViewItem
オブジェクトArchiveCollectionViewItem
は、単一のNSImageView
とで構成されていNSTextField
ます。画像ビューはArchiveCollectionViewItem
の imageView アウトレットに接続され、テキスト フィールドは textField アウトレットに接続されます。
でcollectionView:itemForRepresentedObjectAtIndexPath:
、NSCollectionViewItem に対応するアイテムを見つけて表示します。
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView
itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath
{
if (collectionView == self.collectionView && 0 == indexPath.section)
{
NSCollectionViewItem *item =
[collectionView makeItemWithIdentifier:@"ArchiveCollectionViewItem" forIndexPath:indexPath];
if (item && [item isKindOfClass:[ArchiveCollectionViewItem class]])
{
ArchiveCollectionViewItem *archiveCollectionViewItem = (ArchiveCollectionViewItem *) item;
ArchiveItemViewModel *archiveItem = [self archiveItemAtIndexPath:indexPath];
archiveCollectionViewItem.archiveItemViewModel = archiveItem;
return archiveCollectionViewItem;
}
else
{
return item;
}
}
else
{
return nil;
}
}
ArchiveCollectionViewItem
の setArchiveItemViewModel メソッドは次のとおりです。
- (void)setArchiveItemViewModel:(ArchiveItemViewModel *)archiveItemViewModel
{
_archiveItemViewModel = archiveItemViewModel;
NSString *itemName = archiveItemViewModel.name;
NSImage *itemImage = archiveItemViewModel.isFolder ?
[NSImage imageNamed:NSImageNameFolder] :
[[NSWorkspace sharedWorkspace] iconForFileType:itemName.pathExtension.lowercaseString];
self.imageView.image = itemImage;
self.textField.stringValue = itemName;
}
アイテムが の画像にドラッグされた場合を除いて、すべてが意図したとおりに機能しArchiveCollectionViewItem
ます。の非画像部分にアイテムをドラッグするとArchiveCollectionViewItem
、有効なドロップを示す緑色のプラス記号が表示されます。
ただし、アイテムを画像部分にドラッグすると、緑色のプラス記号が消えます。さらに、collectionView:validateDrop:proposedIndexPath:dropOperation:
呼び出されません:
ArchiveCollectionViewItem
ビュー全体がドロップを受け入れるようにするにはどうすればよいですか? それとも、これは不可能/許可されていませんか?
他のほとんどのNSCollectionView
ドラッグ アンド ドロップに関する質問は、アプリケーション内 (再配置) またはアプリケーション内からアプリケーション外へのドラッグ アンド ドロップに焦点を当てています。明確にするために、どちらも私のユースケースではありません。私は(これまでのところ)私のものに似た別のSOの質問を見つけることができなかったので、存在する場合は、謝罪を受け入れてリンクしてください。