Пользовательский элемент управления в NSCollectionViewItem

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

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

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

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

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

ОБНОВЛЕНИЕ

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

ОБНОВЛЕНИЕ 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)];
}

@конец


person Randall    schedule 25.08.2010    source источник
comment
О методе init какого класса вы говорите? Откуда отправляется сообщение init? Убедились ли вы, что проверяете свойство numBoxes того же представления, которое находится в элементе представления коллекции?   -  person Peter Hosey    schedule 25.08.2010
comment
Я говорил о методе инициализации BoxesView. Он вызывается пером, которое загружается в один из моих контроллеров. Контроллер является владельцем NSCollectionView   -  person Randall    schedule 25.08.2010
comment
Пожалуйста, отредактируйте свой вопрос, чтобы включить код, который вы используете для настройки представления коллекции, для загрузки представлений элементов, а также для создания и настройки элементов представления коллекции.   -  person Peter Hosey    schedule 26.08.2010


Ответы (3)


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

person Randall    schedule 27.08.2010

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

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

Использование ручных привязок с NSCollectionView/Item

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

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

person Joshua Nozzi    schedule 25.08.2010
comment
В конечном итоге проблема заключается в том, что все значения по умолчанию, которые я даю своим значениям членов, обнуляются. Таким образом, любые логические значения НЕТ, любые числа с плавающей запятой равны 0,0, а все остальное равно 0. Я попытался сделать то, что вы сказали, и я оказался в том же месте. - person Randall; 25.08.2010
comment
Тогда я бы предложил добавить как можно больше дополнительных деталей к вашему вопросу. Просто непонятно, что ты делаешь. - person Joshua Nozzi; 25.08.2010

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

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

person JimDusseau    schedule 25.08.2010