我正在使用 NSCollectionView
来显示各种对象。除了一件烦人的事情之外,一切都运转良好。我不知道如何访问 View 上用于表示集合中每个对象的各种控件。
设置如下:
- 我已将
NSCollectionView
拖动到 IB 中的 View 中。 - 我创建了
NSCollectionViewItem
的自定义子类。绘制了我的 IB 类(class) map 。 - 我创建了一个
NSBox
的自定义子类来充当集合中每个对象的 View 。还在 IB 中映射了此类,并将其连接到我的NSCollectionViewItem
子类的view
属性。 - 我在 IB 中进行了所有绑定(bind),以显示每个对象的正确信息。
View :
生成的 Collection View :
由于我的 NSCollectionViewItem
子类基本上是集合中每个 View 的 Controller ,因此我在 Controller 子类中引用了 View 中各种控件的导出:
@interface SourceCollectionViewItem : NSCollectionViewItem
@property (weak) IBOutlet NSTextField *nameTextField;
@property (weak) IBOutlet NSTextField *typeTextField;
@property (weak) IBOutlet RSLabelView *labelView;
@property (weak) IBOutlet NSButton *viewButton;
@end
当我在调试器中检查 SourceCollectionViewItem
的任何实例时,所有属性都显示为 nil,尽管我实际上可以在屏幕上看到它们,并且所有内容都按应有的方式显示。
我的设置灵感来自 Apple 的示例应用程序 IconCollection .
我显然错过了一些东西。什么?
编辑:我发现各种帖子暗示类似的问题: CocoaBuilder.com和 this question就这样。
编辑:为了完整:this post也处理该主题,并根据已接受答案中提到的选项组合提供解决方案。
最佳答案
socket 在 Nib 加载期间设置,并且只有原型(prototype)项从 Nib 加载并分配其 socket 。所有其他 ViewItem
及其 View
都是从原型(prototype)克隆的,在这种情况下,outlet 只是从未初始化的实例变量。
以下是我可以想到的选项:
- 覆盖 Collection View 的
newItemForRepresentedObject:
并重新加载 Nib ,而不是克隆原型(prototype)。但这可能会极大地损害性能。 - 覆盖 Collection View 项的
copyWithZone
并使用viewWithTag:
手动分配导出以查找它们。 - 放弃并尝试仅通过绑定(bind)提供数据。
关于cocoa - 访问 NSCollectionView View 的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386753/