NSCollectionViewItem中的自定义控件

时间:2010-08-25 14:35:03

标签: objective-c cocoa custom-controls nscollectionviewitem

我想在我的NSCollectionViewItem的视图中放置一个自定义控件。

假设我有一个名为BoxesView的自定义NSView.BoxesView只是一个在其视图中绘制预定数量的框的视图。该数量的框在init方法中设置。让我说我把它设置为8。

当我加载集合视图时,视图中的所有其他控件都可以正常工作(按钮,滑块等),但我的视图不会绘制。

如果我在BoxesView的drawRect方法中设置断点,则表明要绘制的框数为0!如果我在我的init方法中设置一个断点,我将numBoxes设置为8,它表明numBoxes实际上设置为8.此外,即使集合视图中有多行,init方法也只被调用一次。

我做错了什么?

更新

我能够通过将itemPrototype设置为从xib加载而不是与NSCollectionViewItem位于同一个xib中来实现此功能。这很好,除了它只适用于10.6而不是10.5。

更新2

我正在尝试做的是将我的自定义视图粘贴到已经存在的NSCollectionViewItem已经存在的视图中。会发的是成员变量mBoxWidth被吹散并且为零所以当它去绘制时,没有任何反应。

@implementation DumbView

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
       mBoxWidth = 3;
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
   NSRect bounds = self.bounds;
   [[NSColor redColor]set];
   [NSBezierPath fillRect:NSMakeRect(bounds.origin.x, bounds.origin.y, mBoxWidth, mBoxWidth)];
}

@end

3 个答案:

答案 0 :(得分:1)

我没有实现initWithCoder。这解决了一切。

答案 1 :(得分:0)

NSCollectionViewItem使用原型视图,该视图被复制并连接到集合表示的对象中的每个项目。

可以为你的自定义视图制作一个IBPlugin(一个公开numberOfBoxesToDraw绑定的那个),但这是一个痛苦的屁股,并且有一个更简单的方法:手动绑定。

在NSCollectionView / Item中使用手动绑定

首先,subclcass NSCollectionViewItem,告诉IB使用这个新的子类,并确保你有一个连接到自定义视图的插座(如boxView)。

接下来,子类NSCollectionView(设置IB使用此子类)并覆盖-newItemForRepresentedObject:。在其中,您将首先调用super(将结果存储到局部变量),然后使用您在模型中使用的“numberOfBoxes”键将“boxView”的框数手动绑定到所表示的对象。 / p>

答案 2 :(得分:0)

您是否尝试过重载copyWithZone?

我猜你的项目正在被复制,而不是直接初始化。