0

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

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

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

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

我究竟做错了什么?

更新

我可以通过将 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)];
}

@结尾

4

3 回答 3

1

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

于 2010-08-27T18:30:06.893 回答
0

您是否尝试过重载 copyWithZone?

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

于 2010-08-25T20:24:14.507 回答
0

NSCollectionViewItem 使用一个原型视图,它为集合的表示对象中的每个项目复制和连接。

可以为您的自定义视图(公开 numberOfBoxesToDraw 绑定)制作 IBPlugin 的所有麻烦,但这很麻烦,并且有一种更简单的方法:手动绑定。

在 NSCollectionView/Item 中使用手动绑定

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

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

于 2010-08-25T17:53:01.607 回答