私はNSArray
カスタムのを持っていますNSObjects
。各オブジェクトには、いくつかのプロパティと、グリッド ビューに表示したい画像があります。NSMatrix は私の問題に対する適切な解決策のようですが、オブジェクトのコンテンツを表示する際に問題が発生しています。
注意すべきことがいくつかあります。
- コアデータを使用していない
- 私はプログラムでこれをやろうとしています
- 使用を検討し
NSCollectionView
ましたがNSMatrix
、この場合はより良い解決策のようです - すべてのセルは互いに同じ表示形式に従います。つまり、異なるセルに異なるタイプのオブジェクトを渡したくありません。オブジェクトの異なるインスタンスだけを渡します。
ウィンドウにNSView
(matrixContainerView) があるとします。コントローラー ファイルには、IBOutlet
to matrixContainerView があります。私のコントローラーでは、awakeFromNibに次のものがあります。
NSMatrix* matrix = [[NSMatrix alloc]
initWithFrame:[matrixContainerView bounds]
mode:NSRadioModeMatrix
cellClass:[MyCustomCell class]
numberOfRows:5
numberOfColumns:5];
[matrix setCellSize:NSMakeSize(116, 96)];
[matrix setNeedsDisplay:YES];
[matrixContainerView addSubview:[matrix autorelease]];
[matrixContainerView setNeedsDisplay:YES];
クラスMyCustomCell
ヘッダーは次のようになります。
@interface MyCustomCell : NSCell {
MyModel * theObject;
}
-(MyModel *)theObject;
-(void)setTheObject:(MyModel *)newValue;
実装ファイルは次のとおりです (図は簡略化されています)。
@implementation MyCustomCell
-(void)drawInteriorWithFrame:(NSRect)theFrame inView:(NSView *)theView {
...drawing code using MyModel e.g. [MyModel isValid] etc...
}
-(MyModel *)theObject {
return theObject;
}
-(void)setTheObject:(MyModel *)newValue {
[theObject autorelease];
theObject = [newValue retain];
}
@end
コントローラー内のオブジェクトを含む配列の初期化と設定の後、オブジェクトのインスタンスを設定MyModel
したいと思いNSMatrix
ます。
どうすればいいですか?
次のように、配列から2つのオブジェクトだけを追加しようとしました(テストとして):
MyCustomCell * cellOne = (MyCustomCell *)[matrix cellAtRow:0 column:0];
[cell setTheObject:[myArrayOfObjects objectAtIndex:0]];
MyCustomCell * cellTwo = (MyCustomCell *)[matrix cellAtRow:0 column:1];
[cellTwo setTheObject:[myArrayOfObjects objectAtIndex:1]];
しかし、これは最初のオブジェクト イメージを作成するだけです。上記が機能した場合、配列を列挙してオブジェクトを追加するのは簡単な作業でした。
セルを追加し、適切なオブジェクトをそれらのセルに渡して正しく表示するにはどうすればよいですか?
Appleのドキュメントは、プログラミング ガイドに関する限り、NSMatrix については控えめに言ってもまばらです。そこにある情報は私にとって非常に役に立ちますが、それはオブジェクトを追加して表示させた後でのみです!
アップデート
(上記の例のように) 2 つのオブジェクトを追加しない場合、出力は同じです。つまり、カスタム セルの 1 つの表現が画面に描画されます。これは、私が見ている単一の表現がマトリックスの初期化時に行われており、実際には列0行0に何も描画していないと思っていたことを示しています。それは今私をもっと混乱させます。