我正在设计一个类似于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问题(到目前为止),因此,如果存在,请接受我的歉意并将其链接到我。
答案 0 :(得分:1)
即使图像视图不可编辑,它显然仍然可以处理拖放操作。要解决此问题,请调用图像视图的unregisterDraggedTypes
方法。
相同的问题:NSOutlineView spring loading exits over NSImageView but not NSButton。