Передача массива пользовательских объектов в NSCell в NSMatrix программно

У меня есть NSArray обычая NSObjects, Каждый объект имеет некоторые свойства и изображение, которое я хотел бы отобразить в виде сетки. NSMatrix, кажется, является хорошим решением моей проблемы, но у меня есть проблемы с получением содержимого объектов для отображения.

Несколько вещей, чтобы отметить.

  1. Я не использую основные данные
  2. Я пытаюсь сделать это программно
  3. Я рассмотрел использование NSCollectionView но NSMatrix кажется, лучшее решение в этом случае
  4. Все ячейки имеют одинаковый формат отображения, то есть я не хочу передавать разные ячейки различным типам объектов, просто разные экземпляры объекта.

Предположим, у меня есть 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]

Другие вопросы по тегам