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

2

即使图像视图不可编辑,它显然仍然可以处理拖放。要解决此问题,请调用图像视图的unregisterDraggedTypes方法。

同样的问题:NSOutlineView 弹簧加载退出 NSImageView 但不是 NSButton

于 2018-08-01T22:11:41.660 回答