0

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の質問を見つけることができなかったので、存在する場合は、謝罪を受け入れてリンクしてください。

4

1 に答える 1