【问题标题】:Custom control in NSCollectionViewItemNSCollectionViewItem 中的自定义控件
【发布时间】:2010-08-28 02:30:06
【问题描述】:

我想在我的 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)];
}

@结束

【问题讨论】:

  • 你指的是哪个类的init方法? init 消息是从哪里发送的?您是否确认您正在检查集合视图项中同一视图的 numBoxes 属性?
  • 我说的是 BoxesView 的 init 方法。它被我的一个控制器中加载的笔尖调用。控制器是 NSCollectionView 的所有者
  • 请编辑您的问题以包含您用于设置集合视图、加载项目视图以及创建和设置集合视图项目的代码。

标签: objective-c cocoa custom-controls nscollectionviewitem


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    在 NSCollectionView/Item 中使用手动绑定

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

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

    【讨论】:

    • 问题最终是我给成员值的默认值都被清零了。所以任何布尔值都是“否”,任何浮点数都是 0.0,其他一切都是 0。我试着按照你说的做,结果还是在同一个地方。
    • 那么我建议尽可能多地为您的问题添加更多细节。只是不清楚你在做什么。
    【解决方案3】:

    您是否尝试过重载 copyWithZone?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多