Пользовательский элемент управления в NSCollectionViewItem - PullRequest
0 голосов
/ 25 августа 2010

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

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

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

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

Что я делаю не так?

UPDATE

Мне удалось заставить это работать, установив 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)];
}

@ конец

Ответы [ 3 ]

1 голос
/ 27 августа 2010

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

0 голосов
/ 26 августа 2010

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

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

0 голосов
/ 25 августа 2010

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

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

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

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

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

...