如何从NSCollectionViewItem中的视图获取representObject?

时间:2009-07-14 01:40:29

标签: objective-c cocoa cocoa-bindings nscollectionview

我有一个在我的每个CollectionView项目中使用的视图。我从我的视图中有一个关于CollectionViewItem的IBOutlet,我将它连接到Interface Builder中。我想在我的视图代码中访问来自representObject(它是一个Core Data对象)的值。这是我正在尝试做的一个例子 - 访问代表对象的序列值:

在.h文件中:

IBOutlet NSCollectionViewItem *item; // Connected in IB

在.m文件中

NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)

我知道seq是填充的,因为我使用representObject.seq键路径将它绑定到IB中CollectionViewItem视图中的标签,并且可以正常工作。

任何想法为什么当我尝试在视图的代码中访问seq的值时它返回null?

4 个答案:

答案 0 :(得分:1)

NSCollectionViewItem很可能不会将IBOutlet连接从它们的项目视图复制到原型NSCollectionViewItem。因此,item为零,因此seq也将为零。

访问NSCollectionViewItem实例的典型模式是绑定到原型。你提到你这样做了,它确实有效。这只是因为这是典型的,受支持的方式。

如果您确实需要以绑定无法提供的方式直接连接到项目,则可能需要手动设置。一种方法是覆盖NSCollectionViewItem的-copyWithZone:,调用super,然后手动建立连接。

答案 1 :(得分:1)

1)子类化用于在集合视图中呈现项目的NSView

2)在此子类中,添加委托属性

3)Sublcass NSCollectionViewItem

4)覆盖setView:方法。添加一行以将视图的委托属性设置为NSCollectionViewItem实例(即self)。

现在,在NSView子类中,您可以通过delegate属性访问相应的NSCollectionView项(例如,您可以访问其representObject)。

答案 2 :(得分:0)

我遇到了同样的问题,但是找到了一个非常简单的解决方案:我将视图放在一个不同的.xib中并将其链接到NSCollectionViewItem(实际上是一个NSViewController)。然后,将为每个单元格反序列化.xib,并设置所有出口。

答案 3 :(得分:0)

  1. 子类NSView。
  2. 将委托方法添加到所述子类......类似于- (void)mouseDownOnItemAtIndex:(NSUInteger)index,以告诉听众用户点击了特定索引处的项目。
  3. 在同一个班级中使用self.superview拉取集合视图。创建一个变量来存储NSUInteger。使用方法[[collectionView subviews] indexOfObject:self]存储项目的索引。在委托方法index参数中传递该索引。
  4. 符合NSView中定义的协议的类现在可以从特定单元格中的任何mousedown事件中听到。如果您想要特定项目的代表对象,只需致电collectionView:itemAtIndex并通过representedObject上的NSCollectionViewItem属性访问该项目。