无法拖动到 NSCollectionViewItem 中的图像上
Cannot drag onto image in NSCollectionViewItem
我正在设计一个类似于 Finder 的文件夹浏览器应用程序。我想让用户能够从应用程序外部拖动文件并将它们放到我的应用程序内的文件夹中,从而将拖动的项目添加到该文件夹中。
我的自定义 NSCollectionViewItem
对象 ArchiveCollectionViewItem
由一个 NSImageView
和一个 NSTextField
组成。图像视图连接到 ArchiveCollectionViewItem
的 imageView 出口,文本字段连接到 textField 出口。
在collectionView:itemForRepresentedObjectAtIndexPath:
中找到NSCollectionViewItem对应的item并显示:
- (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 问题(到目前为止),所以如果存在,请接受我的道歉并 link 我来解决。
即使图像视图不可编辑,它显然仍然可以处理拖放。要修复此问题,请调用图像视图的 unregisterDraggedTypes
方法。
同样的问题:。
我正在设计一个类似于 Finder 的文件夹浏览器应用程序。我想让用户能够从应用程序外部拖动文件并将它们放到我的应用程序内的文件夹中,从而将拖动的项目添加到该文件夹中。
我的自定义 NSCollectionViewItem
对象 ArchiveCollectionViewItem
由一个 NSImageView
和一个 NSTextField
组成。图像视图连接到 ArchiveCollectionViewItem
的 imageView 出口,文本字段连接到 textField 出口。
在collectionView:itemForRepresentedObjectAtIndexPath:
中找到NSCollectionViewItem对应的item并显示:
- (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 问题(到目前为止),所以如果存在,请接受我的道歉并 link 我来解决。
即使图像视图不可编辑,它显然仍然可以处理拖放。要修复此问题,请调用图像视图的 unregisterDraggedTypes
方法。
同样的问题: