Я нашел другое решение, которое могло бы помочь.
Для этого решения я создал подкласс NSCollectionViewItem и NSView соответственно (и для простоты объяснения) ItemViewController
и ItemView
.
Я предполагаю, что вы работаете с IB, где вы уже связали свой NSCollectionView с ContentArray вашего NSArrayController (также связывает selectionIndexes).
Затем добавьте объект ViewController в NIB и убедитесь, что его пользовательский класс установлен на ItemViewController
. Теперь подключите его к выходу itemPrototype вашего NSCollectionView.
Затем добавьте объект пользовательского представления в NIB и установите для его пользовательского класса значение ItemView
. Подключите его выход к свойству вида вашего ItemViewController
.
В файле интерфейса ItemView
создайте свойство, похожее на представленный объект. Под этим я подразумеваю что-то вроде:
@property (nonatomic, assign) id someRepresentedObjectPropertyName
Это будет свойство, которое будет представлять элемент в вашем NSArrayController.
Теперь перейдите к файлу реализации ItemViewController
и переопределите метод -setRepresentedObject:
. Здесь мы сначала дадим дескриптору ItemViewController
установку своего представленного объекта, а затем мы назначим тот же представленный объект свойству, которое мы сделали в ItemView
. Переопределение будет выглядеть так:
-(void)setRepresentedObject:(id)representedObject {
[super setRepresentedObject:representedObject];
//Do some appropiate checking on the representedObject...
if (self.view != nil) {
[(ItemView *)self.view setSomeRepresentedObjectPropertyName:self.representedObject];
}
}
Теперь, если вы вернетесь к реализации ItemView
, вы можете переопределить метод -rightMouseUp:
, построить / настроить NSMenu и использовать метод -popUpMenuPositioning...:
. Для свойства someRepresentedObjectPropertyName
ItemView
должен быть указан правильный элемент в вашем NSArrayController.
EDIT:
Вместо переопределения -setRepresentedObject
вы также можете привязать ItemView
someRepresentedObjectPropertyName
к representedObject.someRepresentedObjectPropertyName