代码之家  ›  专栏  ›  技术社区  ›  Septih

正在获取nsCollectionView中右键单击的nsArrayController项

  •  2
  • Septih  · 技术社区  · 16 年前

    我正在尝试使用nsCollectionView创建一个文件资源管理器,目前正在为每个项目实现右键单击菜单(即复制/删除/重命名等)。我目前有:

    • 与包含自定义对象的NSarrayController链接的nsCollectionView
    • nsbox的子类作为每个项的视图,它还跟踪鼠标事件并将其传递给控制器。
    • 控制器有一个NSMENU插座(RCMENU)和一个NSVIEW插座(ITEMVIEW),用于NSBOX子类,该子类应位于菜单弹出窗口的位置。
    • 调用菜单的代码是:

      [nsmenu弹出上下文菜单:rcmenu withevent:event forview:itemview];

    一旦运行,它的工作原理是当右键单击集合视图中的项目时弹出菜单,但是在检查传递给控制器的事件时,除了x,y坐标(看起来是针对nswindow而不是项目或nscollectionview)之外,我实际上没有任何东西可以用来找出右键单击的项目。我真正想要的是在nsarraycontroller中右键单击视图的对象。

    这取决于我是否设置错误,是否有一个简单的方法来解决,还是仅仅是很难解决?

    2 回复  |  直到 11 年前
        1
  •  2
  •   Peter Hosey    16 年前

    您可以尝试设置每个集合视图项视图的菜单。最有可能的是,您将通过覆盖 +defaultMenu 在项视图类中。一旦你这样做了,评论出 popUpContextMenu:withEvent:forView: 留言,看看你能不能不带着它逃走。

    此外,为不同的项目提供不同的菜单也不难(例如,文件夹与包与文件,以及不同类型的文件)。你可能得重写 -menuForEvent: 而不是 默认菜单 .

        2
  •  1
  •   Gerald Eersteling    11 年前

    我找到了另一个可能有帮助的解决方案。

    对于这个解决方案,我分别创建了nsCollectionViewItem和nsView的子类(为了便于解释) ItemViewController ItemView .

    我假设您使用的是ib,其中您已经将nsCollectionView绑定到nsArrayController的ContentArray(也绑定selectionIndex)。

    接下来,向NIB添加一个viewController对象,并确保其自定义类设置为 项视图控制器 . 现在将其连接到nsCollectionView的itemPrototype出口。

    接下来,将自定义视图对象添加到NIB并将其自定义类设置为 ItMeVIEW . 将其插座连接到 项视图控制器 .

    在的接口文件中 ItMeVIEW 创建一个类似representedObject的属性。我的意思是:

    @property (nonatomic, assign) id someRepresentedObjectPropertyName
    

    这将是表示NSarrayController中的项的属性。 现在转到的实现文件 项视图控制器 并覆盖 -setRepresentedObject: 方法。在这里我们先让 项视图控制器 处理设置其representedObject,然后将相同的representedObject分配给在中创建的属性 ItMeVIEW . 覆盖如下:

    -(void)setRepresentedObject:(id)representedObject {
        [super setRepresentedObject:representedObject];
    
        //Do some appropiate checking on the representedObject...
    
        if (self.view != nil) {
            [(ItemView *)self.view setSomeRepresentedObjectPropertyName:self.representedObject];
        }
    }
    

    现在,如果回到 ItMeVIEW 您可以重写该方法 -rightMouseUp: 在那里建立/设置一个nsmenu并使用 -popUpMenuPositioning...: 方法。这个 someRepresentedObjectPropertyName 性质 ItMeVIEW 应设置为NSarrayController中的正确项。

    编辑:

    而不是重写 -setRepresentedObject 你也可以把 ItMeVIEW SomeRepresentedObjectPropertyName representedObject.someRepresentedObjectPropertyName