如何从 NSCollectionViewItem 的视图中获取representedObject?
-
13-09-2019 - |
题
我有一个在 CollectionView 的每个项目中使用的视图。从我的角度来看,我有一个到 CollectionViewItem 的 IBOutlet,并且我已将其连接到 Interface Builder 中。我想在我的视图代码中访问representedObject(这是一个核心数据对象)的值。这是我正在尝试执行的操作的示例——访问representedObject 的序列值:
在.h文件中:
IBOutlet NSCollectionViewItem *item; // Connected in IB
在 .m 文件中
NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)
我知道 seq 已填充,因为我使用 returnedObject.seq 键路径将其绑定到 IB 中 CollectionViewItem 视图中的标签,并且可以正常工作。
知道为什么当我尝试访问视图代码中的 seq 值时它返回 null 吗?
解决方案
这很可能是NSCollectionViewItem不超过IBOutlet中连接从他们的项目的意见复制原型NSCollectionViewItem。因此,item
是零,所以seq
也将是零。
用于访问NSCollectionViewItem实例的典型模式是结合到原型。你提到你做这做那它的作品。这很简单,因为这是做它的典型,支持的方式。
如果你真的需要的方式,绑定不能提供该项目直接连接,你可能不得不手动设置。要做到这一点的方法之一是覆盖NSCollectionViewItem的-copyWithZone:
,调用超,然后手动进行连接。
其他提示
1)的子类,用于在收集视图
渲染项目的NSView2)在该亚类中,添加一个代表属性
3)的Sublcass NSCollectionViewItem
4)重写的setView:方法。添加一行设置视图到NSCollectionViewItem实例(即自我)的代表属性。
现在是NSView子类中,你将不得不通过委托属性(例如就可以访问它representedObject)访问对应NSCollectionView项。
我有同样的问题,但发现了一个很简单的解决办法:我把视图在不同的.xib和在NSCollectionViewItem联的(这其实是一个NSViewController)。则的.xib将被反序列化针对每个小区和所有出口都设置。
- NSView 的子类。
- 将委托方法添加到所述子类...就像是
- (void)mouseDownOnItemAtIndex:(NSUInteger)index
告诉侦听器用户单击了特定索引处的项目。 - 在同一个类中使用 self.superview 拉取集合视图。创建一个变量来存储 NSUInteger。使用方法存储项目的索引
[[collectionView subviews] indexOfObject:self]
. 。在委托方法中传递该索引index
范围。 - 符合 NSView 中定义的协议的类现在将能够侦听特定单元格上的任何 mousedown 事件。如果你想要特定项目的representedObject,只需调用
collectionView:itemAtIndex
并通过访问它来获取该项目representedObject
属性于NSCollectionViewItem
.