0

NSCollectionViewItemのビュー内にカスタムコントロールを配置したいと思います。

BoxesViewというカスタムNSViewがあるとします。BoxesViewは、ビュー内に所定の数のボックスを描画する単なるビューです。そのボックスの数は、initメソッドで設定されます。8に設定したとしましょう。

コレクションビューをロードすると、ビュー内の他のすべてのコントロール(ボタン、スライダーなど)は正常に機能しますが、ビューが描画されません。

BoxesViewのdrawRectメソッドにブレークポイントを設定すると、描画するボックスの数が0であることが示されます。numBoxesを8に設定したinitメソッドにブレークポイントを設定すると、numBoxesが実際に8に設定されていることがわかります。また、コレクションビューに複数の行がある場合でも、initメソッドは1回だけ呼び出されます。

私は何が間違っているのですか?

アップデート

NSCollectionViewItemと同じxibにあるのではなく、xibからロードするようにitemPrototypeを設定することで、これを機能させることができました。これは素晴らしいですが、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での手動バインディングの使用

まず、NSCollectionViewItemをサブクラス化し、この新しいサブクラスを使用するようにIBに指示し、カスタムビューに接続されているアウトレット(boxViewなど)があることを確認します。

次に、NSCollectionViewをサブクラス化し(このサブクラスを使用するようにIBを設定します)、- newItemForRepresentedObject:をオーバーライドします。その中で、最初にsuperを呼び出し(結果をローカル変数に格納)、次にモデルで使用している「numberOfBoxes」キーを使用して、「boxView」のボックスの数を表現されたオブジェクトに手動でバインドします。

于 2010-08-25T17:53:01.607 に答える