我想在我的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
答案 0 :(得分:1)
我没有实现initWithCoder。这解决了一切。
答案 1 :(得分:0)
NSCollectionViewItem使用原型视图,该视图被复制并连接到集合表示的对象中的每个项目。
你可以为你的自定义视图制作一个IBPlugin(一个公开numberOfBoxesToDraw绑定的那个),但这是一个痛苦的屁股,并且有一个更简单的方法:手动绑定。
在NSCollectionView / Item中使用手动绑定
首先,subclcass NSCollectionViewItem,告诉IB使用这个新的子类,并确保你有一个连接到自定义视图的插座(如boxView)。
接下来,子类NSCollectionView(设置IB使用此子类)并覆盖-newItemForRepresentedObject:。在其中,您将首先调用super(将结果存储到局部变量),然后使用您在模型中使用的“numberOfBoxes”键将“boxView”的框数手动绑定到所表示的对象。 / p>
答案 2 :(得分:0)
您是否尝试过重载copyWithZone?
我猜你的项目正在被复制,而不是直接初始化。