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

发布于 2024-07-26 09:53:55 字数 585 浏览 7 评论 0原文

我有一个在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

已下线请稍等 2024-08-02 09:53:55

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, so seq 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.

執念 2024-08-02 09:53:55

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).

聚集的泪 2024-08-02 09:53:55

我遇到了同样的问题,但找到了一个非常简单的解决方案:我将视图放在不同的 .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.

孤独患者 2024-08-02 09:53:55
  1. NSView 的子类。
  2. 将委托方法添加到所述子类...类似于 - (void)mouseDownOnItemAtIndex:(NSUInteger)index 来告诉侦听器用户单击了特定索引处的项目。
  3. 在同一个类中使用 self.superview 拉取集合视图。 创建一个变量来存储 NSUInteger。 使用方法[[collectionView subviews]indexOfObject:self]存储项目的索引。 在委托方法 index 参数中传递该索引。
  4. 符合 NSView 中定义的协议的类现在将能够侦听特定单元格上的任何 mousedown 事件。 如果您想要特定项目的representedObject,只需调用collectionView:itemAtIndex并通过NSCollectionViewItem上的representedObject属性访问该项目即可获取该项目。
  1. Subclass NSView.
  2. Add delegate method to said subclass... something like - (void)mouseDownOnItemAtIndex:(NSUInteger)index to tell the listener that the user clicked on an item at a specific index.
  3. Pull the collection view by using self.superview in the same class. Create a variable to store an NSUInteger. Store the index of the item by using the method [[collectionView subviews] indexOfObject:self]. Pass that index in the delegate method index parameter.
  4. The class that conforms to the protocol defined in your NSView will now be able to hear from any mousedown events at a specific cell. If you want the representedObject of a specific item, just call collectionView:itemAtIndex and get the item by accessing it via the representedObject property on NSCollectionViewItem.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文