2010-08-25 3 views
0

Я хочу поставить пользовательский элемент управления внутри представления для моего NSCollectionViewItem.Пользовательский контроль в NSCollectionViewItem

Допустим, у меня есть пользовательский NSView с именем BoxesView.BoxesView - это просто представление, которое рисует заданное количество ящиков в его представлении. Это число полей задано в методе init. Допустим, я установил его на 8.

Когда я загружаю представление коллекции, все остальные элементы управления в представлении работают нормально (кнопки, слайдеры и т. Д.), Но мое представление не будет рисовать.

Если я установил точку останова в методе drawRect BoxesView, это показывает, что количество полей для рисования равно 0! Если я установил точку останова в моем методе init, где я установил numBoxes в 8, это покажет, что numBoxes действительно получает значение 8. Кроме того, метод init получает только один раз, хотя в представлении коллекции есть несколько строк.

Что я делаю неправильно?

UPDATE

Я был в состоянии получить эту работу, установив itemPrototype для загрузки из XIb вместо того, чтобы быть в том же XIb как NSCollectionViewItem. Это здорово, за исключением того, что он работает только с 10.6, а не с 10.5.

UPDATE 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)]; 
} 

@end

+0

В каком классе 'init' вы ссылаетесь?Откуда отправляется сообщение «init»? Вы проверили, что вы проверяете свойство 'numBoxes' того же представления, которое находится в элементе представления коллекции? –

+0

Я говорил о методе инициализации BoxesView. Он вызывается лентой, загружаемой в один из моих контроллеров. Контроллер является владельцем NSCollectionView – Randall

+0

. Измените свой вопрос, чтобы включить код, который вы используете для настройки вида коллекции, для загрузки представлений элементов, а также для создания и настройки элементов коллекционного просмотра. –

ответ

1

Я не реализовал initWithCoder. Это все исправляет.

0

NSCollectionViewItem использует вид прототипа, который дублируется и проводной для каждого элемента, представленных объектов коллекции.

Вы могли пройти через все трудности, чтобы сделать IBPlugin для пользовательского зрения (тот, который выставляет numberOfBoxesToDraw связывание), но это боль в заднице и есть более простой способ: ручной привязок.

Использование Руководство привязок с NSCollectionView/Item

Во-первых, subclcass NSCollectionViewItem, скажите IB, чтобы использовать этот новый подкласс, и убедитесь, что у вас есть выход в ней (как boxView), который подключен к вашему пользовательский вид.

Далее, подкласс NSCollectionView (установить IB для использования этого подкласса) и переопределить -newItemForRepresentedObject:. В нем вы сначала вызываете супер (сохраняете результат в локальной переменной), затем вручную привязываете количество ящиков boxbox к представленному объекту с помощью ключа «numberOfBoxes», который вы используете в своей модели.

+0

Проблема заключается в том, что значения по умолчанию, которые я даю своим значениям-членам, все обнулены. Таким образом, любые логические значения NO, любые поплавки равны 0.0, а все остальное равно 0. Я попытался сделать то, что вы сказали, и я попал туда же. – Randall

+0

Тогда я бы предложил добавить как можно больше дополнительной информации к вашему вопросу. Просто не ясно, что вы делаете. –

0

Вы пытались перегрузить copyWithZone?

Я предполагаю, что ваш товар копируется, а не непосредственно init'd.

Смежные вопросы