【问题标题】:How do you initialize a NSCollectionViewItem?你如何初始化一个 NSCollectionViewItem?
【发布时间】:2011-05-31 22:44:37
【问题描述】:

我正在尝试设置一个在各个 NSCollectionViewItem 视图中具有自定义绘图的 NSCollectionView。我有一个需要在每个视图中绘制的图像,但我无法将视图链接回 Interface Builder 中的 NSCollectionViewItem 子类。是否有我可以与我的 NSCollectionViewItem 一起使用的 init 方法来执行初始化操作?我试图实现 copyWithZone,但我做错了,因为我得到了一些永恒的循环。目前,我发现与视图建立连接的唯一机会是在使用 -(void)setSelected:(BOOL)flag 更改选择之后。我想在视图中进行绘图,但我需要来自我的代表对象的图像作为我的源。我读到的与 NSCollectionView 相关的所有内容似乎都不完整。

@implementation CollectionViewItem
    -(void)setSelected:(BOOL)flag {
        [super setSelected:flag];
        NSLog(@"setSelected: %d", flag);
        // tell the view that it has been selected
        [(CollectionViewItemView* )[self view] setSelected:flag];
        // This is where I pass my image to my view
        [(CollectionViewItemView* )[self view] setOriginalSprite:[(MyModel* )self.representedObject imageSource]];
        [(CollectionViewItemView* )[self view] setNeedsDisplay:YES];
    }
@end

【问题讨论】:

    标签: cocoa nsview nscollectionview nscollectionviewitem


    【解决方案1】:

    我找到了这个文档 - NSCollectionViewItem class

    我在那里发现的显示设置参考如下:

    Setting the Represented Object
    
        – representedObject Available in Mac OS X v10.5 through Mac OS X v10.5
        – setRepresentedObject: Available in Mac OS X v10.5 through Mac OS X v10.5 
    

    您的样本: -(void)setSelected:(BOOL)标志

    我不懂语言,但BOOL 是 id 吗?

    setRepresentedObject:

    设置接收者的表示对象 到指定的模型对象。 (适用于 Mac OS X v10.5 至 Mac OS X v10.5。) - (void)setRepresentedObject:(id)object 参数

    对象

    The receiver’s model object.
    

    可用性

    Available in Mac OS X v10.5 through Mac OS X v10.5.
    

    在 NSCollectionView.h 中声明

    注意:我确实在文档中看到了这一点:

    重要提示:在 Mac OS X v10.5 中,NSCollectionViewItem 类的超类是 NSObject。在 Mac OS X v10.6 及更高版本中,NSCollectionViewItem 现在是 NSViewController 的子类。进行此更改是为了改进视图在 NSCollectionView 中的复制方式。 NSCollectionViewItem 与以前的实现保持二进制兼容,并且正确处理了取消归档。

    因此,如果您习惯于使用较旧的 API,那么自您上次执行此操作以来可能已经发生了一些变化...???

    【讨论】:

    • 我想我之前尝试过 setRepresentedObject,但我一定做错了。这次奏效了。谢谢!
    【解决方案2】:

    我无法将视图链接回 Interface Builder 中的 NSCollectionViewItem 子类。

    您应该将自定义视图中的元素绑定到文件所有者(其类应为CollectionViewItem)表示的对象。例如,您的图像视图将绑定到文件的所有者,模型键路径为representedObject.imageSource

    是否有我可以与 NSCollectionViewItem 一起使用的 init 方法来执行初始化操作?

    NSCollectionViewItemNSViewController 的子类。因此,您可以覆盖-loadView 来执行自定义初始化。例如,

    @implementation CollectionViewItem
    …
    - (void)loadView {
        [super loadView];
        self.someProperty = someDefaultValue;
    }
    …
    @end
    

    【讨论】:

    • @David 如果没有发送-loadView,则说明您的设置有些奇怪。我在我的两个项目中使用它,它工作得很好。如果覆盖 -awakeFromNib 和/或 -initWithNibName:bundle: 会发生什么?
    • 我自己只是在试验 NSCollectionView 和 NSCollectionViewItem,我相信 loadView 只被调用一次 - 当应用程序启动时。这是因为(令人讨厌)NSCollectionView 只创建一个 NSCollectionView(当应用程序启动时),然后在每次由 CollectionView 创建的新 NSView 需要一个新的 NSView 时从该原型执行一个 copyWithZone。
    猜你喜欢
    • 1970-01-01
    • 2022-08-22
    • 2011-05-22
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多