Как получить представленный объект из представления в NSCollectionViewItem? - PullRequest
6 голосов
/ 14 июля 2009

У меня есть представление, которое используется в каждом из элементов моего CollectionView. У меня есть IBOutlet для CollectionViewItem с моей точки зрения, и я подключен в Интерфейсном Разработчике. Я хочу получить доступ к значению из представленного объекта (который является объектом базовых данных) в моем коде представления. Вот пример того, что я пытаюсь сделать - получить доступ к значению последовательности представленного объекта:

В файле .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 в коде для представления, оно возвращает ноль?

Ответы [ 4 ]

1 голос
/ 21 января 2010

1) Подкласс NSView, который используется для визуализации элемента в представлении коллекции

2) В этом подклассе добавьте свойство делегата

3) Подкласс NSCollectionViewItem

4) Переопределить метод setView:. Добавьте строку, чтобы установить свойство делегата представления для экземпляра NSCollectionViewItem (т.е. self).

Теперь внутри подкласса NSView у вас будет доступ к соответствующему элементу NSCollectionView через свойство делегата (например, вы можете получить доступ к его представленному объекту).

1 голос
/ 14 июля 2009

Весьма вероятно, что NSCollectionViewItem не копирует соединения IBOutlet из представлений этих элементов в прототип NSCollectionViewItem. Следовательно, item равно нулю, поэтому seq также будет равно нулю.

Типичный шаблон для доступа к экземпляру NSCollectionViewItem - привязка к прототипу. Вы упоминаете, что сделали это и что это работает. Это просто потому, что это типичный поддерживаемый способ сделать это.

Если вам действительно необходимо подключение напрямую к элементу способом, который не может обеспечить привязка, вам, вероятно, придется настроить его вручную. Один из способов сделать это - переопределить NSCollectionViewItem -copyWithZone:, вызвать super, а затем установить соединение вручную.

0 голосов
/ 15 сентября 2015
  1. Подкласс NSView.
  2. Добавить метод делегата к указанному подклассу ... что-то вроде - (void)mouseDownOnItemAtIndex:(NSUInteger)index, чтобы сообщить слушателю, что пользователь щелкнул элемент по определенному индексу.
  3. Извлечь представление коллекции, используя self.superview в том же классе. Создайте переменную для хранения NSUInteger. Сохраните индекс предмета, используя метод [[collectionView subviews] indexOfObject:self]. Передайте этот индекс в метод делегата index параметр.
  4. Класс, который соответствует протоколу, определенному в NSView, теперь сможет получать информацию о любых событиях mousedown в определенной ячейке. Если вам нужен представленный объект определенного элемента, просто позвоните collectionView:itemAtIndex и получите элемент, обратившись к нему через свойство representedObject в NSCollectionViewItem.
0 голосов
/ 16 сентября 2013

У меня была та же проблема, но я нашел очень простое решение: я поместил представление в другой файл .xib и связал его с NSCollectionViewItem (который на самом деле является NSViewController). Затем .xib будет десериализован для каждой ячейки, и все выходы будут установлены.

...