【问题标题】:How do I get the representedObject from a view in an NSCollectionViewItem?如何从 NSCollectionViewItem 中的视图中获取代表对象?
【发布时间】:2009-07-14 01:40:28
【问题描述】:

我有一个在我的每个 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 吗?

【问题讨论】:

    标签: objective-c cocoa cocoa-bindings nscollectionview


    【解决方案1】:

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

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

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

    【讨论】:

    • 我对这个答案感到困惑。首先,@kperryua 声明“访问 NSCollectionViewItem 实例的典型模式是绑定到原型。你提到你做了这个并且它有效。”但是@Austin 的问题只提到了使用“representedObject.seq 键路径”,实际上很难看出如何将 collectionView 的 itemPrototype 绑定到 collectionViewItem 的视图。我说这是不可能的,但我很高兴被证明是错误的。其次,Apple 的 NSObject 的 copyWithZone 的文档:明确指出“你不应该重写这个方法。”
    • 重写 copyWithZone: 是非常安全的,只要在其中调用超类 allocWithZone:。还没有检查他们是否真的说不要这样做,但不知何故,我认为你可能会将它与 allocWithZone: 或类似的东西混淆。
    【解决方案2】:

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

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

    3) 子类化 NSCollectionViewItem

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

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

    【讨论】:

    • setView 方法将被弃用(在 Apple 的文档中被确定为适用于 10.5 和 10.6),尽管它在 10.7 中被调用,但未指定持续多长时间。
    【解决方案3】:

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

    【讨论】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多