代码之家  ›  专栏  ›  技术社区  ›  casvaart Babu Mannavalappil

无法拖到nsCollectionViewItem中的图像上

  •  0
  • casvaart Babu Mannavalappil  · 技术社区  · 6 年前

    我正在设计一个类似于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;
    }
    

    一切按预期工作,除非将项目拖到架构集合视图项的形象。当我将项目拖动到架构集合视图项,我得到一个绿色的加号,表示有效的下降:

    valid drop

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

    invalid drop

    我该怎么做才能得到整个架构集合视图项是否接受删除?或者这不可能/不允许?

    大多数其他NSCollectionView拖放问题的重点是在应用程序内拖放(重新排列)或从应用程序内拖放到应用程序外。很明显,这两个都不是我的用例。到目前为止,我还没有找到另一个和我类似的问题,所以如果有,请接受我的道歉并将我链接到它。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Willeke    6 年前