我正在设计一个类似于 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 问题(到目前为止),所以如果存在,请接受我的道歉并将我链接到它。