我正在设计一个类似于finder的文件夹浏览器应用程序。我希望使用户能够从应用程序外部拖动文件并将其放到应用程序内的文件夹中,从而将拖动的项目添加到该文件夹中。
我的自定义
nscollectionviewitem
object,
archivecollectionviewitem
,由单个
nsImageView
和a
nstextfield
组成。图像视图连接到
archivecollectionviewitem的image view outlet,文本字段连接到text field outlet。
在
collectionview:itemforrepresentedObjectAtindexPath:
中,我找到一个对应于nscollectionviewitem的项,并显示它:
—(nscollectionviewitem*)集合视图:(nscollectionview*)集合视图
表示对象的项索引路径:(nsindepath*)索引路径
{
if(collectionview==self.collectionview&&0==indexpath.section)
{
nsCollectionViewItem*项=
[集合视图makeitemwithidentifier:@“archivecollectionviewitem”for indexpath:indexpath];
if(item&[item iskindofclass:[archivecollectionviewitem class]])
{
archivecollectionviewitem*archivecollectionviewitem=(archivecollectionviewitem*)项;
archiveitemViewModel*archiveitem=[自archiveitemIndexPath:indexPath];
archiveCollectionViewItem.archiveItemViewModel=archiveItem;
返回archivecollectionviewitem;
}
其他的
{
返回项目;
}
}
其他的
{
返回零;
}
}
< /代码>
archivecollectionviewitem的setarchiveitemviewmodel方法如下:
—(void)setarchiveitemviewmodel:(archiveitemviewmodel*)archiveitemviewmodel
{
_ archiveitemViewModel=archiveitemViewModel;
nsstring*itemname=archiveitemviewModel.name;
nsImage*itemImage=archiveitemviewModel.isFolder?
[nsImage ImageNamed:nsImageNameFolder]:
[[nsworkspace sharedworkspace]iconforfilettype:itemname.pathextension.lowercasestring];
self.imageview.image=项目图像;
self.textfield.stringValue=itemName;
}
< /代码>
除了将项目拖到archivecollectionviewitem的图像上之外,所有内容都按预期工作。当我将一个项目拖到我的archivecollectionviewitem的非图像部分时,我得到一个绿色的加号,指示有效的放置:

但是,当我将项目拖到图像部分时,绿色加号消失。此外,collectionview:validatedrop:proposedIndexPath:dropOperation:does not get called:。

我该怎么做才能让整个archivecollectionviewitemview接受放置?或者这不可能/不允许?
大多数其他nscollectionviewdrag and drop问题集中在应用程序内部的拖放(重新排列)或从应用程序内部拖放到应用程序外部。很明显,这两个都不是我的用例。到目前为止,我还没有找到另一个和我类似的问题,所以如果有,请接受我的道歉并将我链接到它。
我的习惯NSCollectionViewItem
对象,ArchiveCollectionViewItem
,由一个NSImageView
和ANSTextField
. 图像视图连接到架构集合视图项
的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;
}
}
架构集合视图项
的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;
}
一切按预期工作,除非将项目拖到架构集合视图项
的形象。当我将项目拖动到架构集合视图项
,我得到一个绿色的加号,表示有效的下降:

但是,当我将项目拖到图像部分时,绿色加号消失。此外,collectionView:validateDrop:proposedIndexPath:dropOperation:
不被调用:

我该怎么做才能得到整个架构集合视图项
是否接受删除?或者这不可能/不允许?
大多数其他NSCollectionView
拖放问题的重点是在应用程序内拖放(重新排列)或从应用程序内拖放到应用程序外。很明显,这两个都不是我的用例。到目前为止,我还没有找到另一个和我类似的问题,所以如果有,请接受我的道歉并将我链接到它。