无法拖动到NSCollectionViewItem中的图像上

时间:2018-08-01 18:17:18

标签: macos nscollectionview nscollectionviewitem

我正在设计一个类似于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的非图像部分时,我得到绿色加号,表示有效的放置:

valid drop

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

invalid drop

我应该怎么做才能获得整个ArchiveCollectionViewItem视图以接受放置?还是不可能/不允许这样做?

大多数其他NSCollectionView拖放问题都集中在应用程序内部(以重新排列)或从应用程序内部到应用程序外部的拖放。需要明确的是,这些都不是我的用例。我还没有找到类似于我的另一个SO问题(到目前为止),因此,如果存在,请接受我的歉意并将其链接到我。

1 个答案:

答案 0 :(得分:1)

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

相同的问题:NSOutlineView spring loading exits over NSImageView but not NSButton