2010-08-11 1 views
1

У меня есть NSArray пользовательских NSObjects. Каждый объект имеет некоторые свойства и изображение, которое я хотел бы отображать в виде сетки. NSMatrix, похоже, является хорошим решением моей проблемы, но у меня возникают проблемы с отображением содержимого объектов.Передача массива пользовательских объектов в NSCell в 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 docs разрешены, по меньшей мере, на NSMatrix, насколько это предусмотрено руководством по программированию. Информация там очень полезна для меня, но только после того, как я добавил объекты и получил их отображение!

Как обычно, все и вся помощь очень ценится.

Update

Если я не добавить два объекта (как в моем примере выше) выход ничем не отличается, то есть одно представление моей пользовательской ячейки обращается на экран. Это говорит мне, что единственное представление, которое я вижу, выполняется при инициализации матрицы, и на самом деле я ничего не рисовал в колонке 0 row 0, когда на самом деле я думал, что это так. Что оставляет меня теперь более смущенным.

+0

Что вы подразумеваете под «это просто создает первое изображение объекта»? Насколько я вижу, вы все делаете правильно. (Я бы использовал синтезированное свойство вместо явно определенных аксессоров для свойства объекта модели объекта. Кроме того, у него уже есть свойство objectValue.) –

+0

@Peter - спасибо за ответ. В моем заявлении «это просто создает первое изображение объекта», я на самом деле имел в виду, что в матрицу вставляется только cellOne (из моего примера). cellTwo никогда не рисуется. Это почти так, как будто в матрице имеется только одна строка и один столбец. Я подтвердил, что матрица имеет правильный размер, выбирая размер (и задайте цвет фона, чтобы быть уверенным). Мои строки и столбцы определены в инициализаторе, поэтому я знаю, что они установлены. Как вы указали, я * * кажется правильным. Настолько разочаровывающе! – Hooligancat

ответ

0

Возможно, матрица имеет две ячейки, но ее рама слишком мала, чтобы отображать их? После добавления ячеек попробуйте позвонить [matrix sizeToCells]