6

我有一个在我的每个 CollectionView 项目中使用的视图。从我的角度来看,我有一个到 CollectionViewItem 的 IBOutlet,我已经在 Interface Builder 中连接了它。我想在我的视图代码中从代表对象(它是一个核心数据对象)访问一个值。这是我正在尝试做的一个示例 - 访问代表对象的序列值:

在 .h 文件中:

IBOutlet NSCollectionViewItem *item; // Connected in IB

在 .m 文件中

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

我知道 seq 已填充,因为我使用代表对象.seq 键路径将它绑定到 IB 的 CollectionViewItem 视图中的标签,并且有效。

知道为什么当我尝试访问视图代码中 seq 的值时它返回 null 吗?

4

4 回答 4

1

NSCollectionViewItem 很可能不会通过 IBOutlet 连接从它们的项目视图复制到原型 NSCollectionViewItem。因此,item是 nil,所以seq也将是 nil。

访问 NSCollectionViewItem 实例的典型模式是绑定到原型。你提到你做了这个并且它有效。这仅仅是因为这是典型的、受支持的方式。

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

于 2009-07-14T02:03:59.687 回答
1

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

2)在这个子类中,添加一个委托属性

3) 子类化 NSCollectionViewItem

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

现在,在 NSView 子类中,您将可以通过委托属性访问相应的 NSCollectionView 项(例如,您可以访问其代表对象)。

于 2010-01-21T16:51:33.810 回答
0

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

于 2013-09-16T11:37:12.290 回答
0
  1. 子类 NSView。
  2. 将委托方法添加到所述子类...类似于- (void)mouseDownOnItemAtIndex:(NSUInteger)index告诉侦听器用户单击了特定索引处的项目。
  3. 在同一个类中使用 self.superview 拉取集合视图。创建一个变量来存储 NSUInteger。使用 方法存储项目的索引[[collectionView subviews] indexOfObject:self]index在委托方法参数中传递该索引。
  4. 符合 NSView 中定义的协议的类现在可以听到特定单元格的任何 mousedown 事件。如果您想要特定项目的代表对象,只需collectionView:itemAtIndex通过representedObjecton 属性访问并调用并获取该项目NSCollectionViewItem
于 2015-09-15T06:50:42.863 回答