如何从 NSCollectionViewItem 的视图中获取representedObject?
我有一个在 CollectionView 的每个项目中使用的视图。 从我的角度来看,我有一个到 CollectionViewItem 的 IBOutlet,并且我已将其连接到 Interface Builder 中。 我想在我的视图代码中访问representedObject(这是一个核心数据对象)的值。 这是我正在尝试做的一个示例 - 访问所表示的对象的序列值:
在 .h 文件中:
IBOutlet NSCollectionViewItem *item; // Connected in IB
在 .m 文件中,
NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)
我知道 seq 已填充,因为我将它绑定到了中的标签IB中的CollectionViewItem视图使用representedObject.seq键路径并且有效。
知道为什么当我尝试访问视图代码中的 seq 值时它返回 null 吗?
I have a view that gets used in each of my CollectionView's items. I have an IBOutlet to the CollectionViewItem from my view and I have that hooked up in Interface Builder. I want to access a value from the representedObject (which is a Core Data object) in my view code. Here is an example of what I'm trying to do -- access a sequence value of the representedObject:
In the .h file:
IBOutlet NSCollectionViewItem *item; // Connected in IB
In the .m file
NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)
I know that the seq is populated because I have it binded to a label in the CollectionViewItem view in IB using the representedObject.seq key path and that works.
Any idea why when I try to access the value for seq in the code for the view it returns null?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
NSCollectionViewItem 很可能不会将 IBOutlet 连接从项目视图复制到原型 NSCollectionViewItem。 因此,
item
为零,因此seq
也将为 nil。访问 NSCollectionViewItem 实例的典型模式是绑定到原型。 你提到你做了这件事并且它有效。 这仅仅是因为这是典型的、受支持的做法。
如果您确实需要以绑定无法提供的方式直接连接到该项目,则可能需要手动设置。 一种方法是覆盖 NSCollectionViewItem 的
-copyWithZone:
,调用 super,然后手动建立连接。It's very likely that NSCollectionViewItem doesn't copy over IBOutlet connections from them item's views to the prototype NSCollectionViewItem. Hence,
item
is nil, soseq
will also be nil.The typical pattern for accessing the NSCollectionViewItem instance is to bind to the prototype. You mention that you did this and that it works. That is simply because that's the typical, supported way of doing it.
If you really need a connection directly to the item in a way that bindings cannot provide, you'll probably have to set it up manually. One way to do this is override NSCollectionViewItem's
-copyWithZone:
, call super, then make the connection manually.1) 子类化用于在集合视图中渲染项目的 NSView
2) 在此子类中,添加委托属性
3) 子类化 NSCollectionViewItem
4) 重写 setView: 方法。 添加一行以将视图的委托属性设置为 NSCollectionViewItem 实例(即 self)。
现在,在 NSView 子类中,您将可以通过 delegate 属性访问相应的 NSCollectionView 项(例如,您可以访问其所表示的对象)。
1) Subclass the NSView that is used for rendering an item in the collection view
2) In this subclass, add a delegate property
3) Sublcass the NSCollectionViewItem
4) Override the setView: method. Add a line to set the delegate property of the view to the NSCollectionViewItem instance (i.e. self).
Now, within NSView subclass, you will have access to the corresponding NSCollectionView item via the delegate property (e.g. you can access its representedObject).
我遇到了同样的问题,但找到了一个非常简单的解决方案:我将视图放在不同的 .xib 中,并将其链接到 NSCollectionViewItem (实际上是 NSViewController)中。 然后,.xib 将为每个单元反序列化,并设置所有出口。
I had the same problem, but found a very easy solution: I put the view in a different .xib and linked this in the NSCollectionViewItem (which is actually a NSViewController). Then the .xib will be deserialized for each cell and all outlets are set.
- (void)mouseDownOnItemAtIndex:(NSUInteger)index
来告诉侦听器用户单击了特定索引处的项目。[[collectionView subviews]indexOfObject:self]
存储项目的索引。 在委托方法index
参数中传递该索引。collectionView:itemAtIndex
并通过NSCollectionViewItem
上的representedObject
属性访问该项目即可获取该项目。- (void)mouseDownOnItemAtIndex:(NSUInteger)index
to tell the listener that the user clicked on an item at a specific index.[[collectionView subviews] indexOfObject:self]
. Pass that index in the delegate methodindex
parameter.collectionView:itemAtIndex
and get the item by accessing it via therepresentedObject
property onNSCollectionViewItem
.