我有一个在我的每个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?
答案 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)
- (void)mouseDownOnItemAtIndex:(NSUInteger)index
,以告诉听众用户点击了特定索引处的项目。[[collectionView subviews] indexOfObject:self]
存储项目的索引。在委托方法index
参数中传递该索引。collectionView:itemAtIndex
并通过representedObject
上的NSCollectionViewItem
属性访问该项目。