Как получить представленный объект из представления в NSCollectionViewItem?
-
13-09-2019 - |
Вопрос
У меня есть представление, которое используется в каждом из элементов моего CollectionView.На мой взгляд, у меня есть IBOutlet для CollectionViewItem, и он подключен в Interface Builder.Я хочу получить доступ к значению из представленного объекта (который является объектом Core Data) в моем коде представления.Вот пример того, что я пытаюсь сделать: получить доступ к значению последовательности представленного объекта:
В файле .h:
IBOutlet NSCollectionViewItem *item; // Connected in IB
В файле .m
NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)
Я знаю, что seq заполнен, потому что он привязан к метке в представлении CollectionViewItem в IB с использованием пути к ключуpresentObject.seq, и это работает.
Есть идеи, почему, когда я пытаюсь получить доступ к значению seq в коде представления, оно возвращает ноль?
Решение
Весьма вероятно, что NSCollectionViewItem не копирует соединения IBOutlet из представлений элемента в прототип NSCollectionViewItem.Следовательно, item
равен нулю, поэтому seq
также будет равен нулю.
Типичный шаблон доступа к экземпляру NSCollectionViewItem — привязка к прототипу.Вы упоминаете, что сделали это и что это работает.Это просто потому, что это типичный и поддерживаемый способ сделать это.
Если вам действительно необходимо подключение непосредственно к элементу таким образом, который не могут обеспечить привязки, вам, вероятно, придется настроить его вручную.Один из способов сделать это — переопределить NSCollectionViewItem. -copyWithZone:
, вызовите super, а затем установите соединение вручную.
Другие советы
1) Подкласс NSView, который используется для рендеринга элемента в представлении коллекции.
2) В этом подклассе добавьте свойство делегата
3) Подкассируйте NSCollectionViewItem
4) Переопределить setView:метод.Добавьте строку, чтобы установить свойство делегата представления для экземпляра NSCollectionViewItem (т.себя).
Теперь в подклассе NSView у вас будет доступ к соответствующему элементу NSCollectionView через свойство делегата (например,вы можете получить доступ к его представленному объекту).
У меня была та же проблема, но я нашел очень простое решение:Я поместил представление в другой .xib и связал его с NSCollectionViewItem (который на самом деле является NSViewController).Затем .xib будет десериализован для каждой ячейки, и все розетки будут установлены.
- Подкласс NSView.
- Добавьте метод делегата в указанный подкласс...что-то вроде
- (void)mouseDownOnItemAtIndex:(NSUInteger)index
чтобы сообщить слушателю, что пользователь нажал на элемент по определенному индексу. - Извлеките представление коллекции, используя self.superview в том же классе.Создайте переменную для хранения NSUInteger.Сохраните индекс элемента, используя метод
[[collectionView subviews] indexOfObject:self]
.Передайте этот индекс в методе делегатаindex
параметр. - Класс, соответствующий протоколу, определенному в вашем NSView, теперь сможет получать информацию о любых событиях mousedown в определенной ячейке.Если вам нужен представленный объект определенного элемента, просто позвоните
collectionView:itemAtIndex
и получите предмет, открыв его черезrepresentedObject
недвижимость наNSCollectionViewItem
.