Передача массива пользовательских объектов в NSCell в NSMatrix программно
У меня есть NSArray
обычая NSObjects
, Каждый объект имеет некоторые свойства и изображение, которое я хотел бы отобразить в виде сетки. NSMatrix, кажется, является хорошим решением моей проблемы, но у меня есть проблемы с получением содержимого объектов для отображения.
Несколько вещей, чтобы отметить.
- Я не использую основные данные
- Я пытаюсь сделать это программно
- Я рассмотрел использование
NSCollectionView
ноNSMatrix
кажется, лучшее решение в этом случае - Все ячейки имеют одинаковый формат отображения, то есть я не хочу передавать разные ячейки различным типам объектов, просто разные экземпляры объекта.
Предположим, у меня есть NSView
(matrixContainerView) в окне. Файл контроллера имеет IBOutlet
в 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
с экземплярами объектов.
Как мне это сделать?
Я попытался добавить только два объекта из массива следующим образом (просто в качестве теста):
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, что касается руководства по программированию. Приведенная там информация очень полезна для меня, но только после того, как я добавил объекты и получил их отображение!
Как обычно, любая помощь очень ценится.
Обновить
Если я не добавлю два объекта (в соответствии с моим примером выше), результат не будет отличаться, то есть одно представление моей пользовательской ячейки будет отображено на экране. Это говорит мне о том, что единственное представление, которое я вижу, выполняется при инициализации матрицы, и на самом деле я ничего не рисовал в столбце 0, строке 0, хотя на самом деле я так думал. Что оставляет меня сейчас более смущенным.
1 ответ
Может быть, матрица на самом деле имеет две ячейки, но ее кадр слишком мал, чтобы отображать их? После добавления клеток попробуйте позвонить [matrix sizeToCells]