Как получить представленный объект из представления в NSCollectionViewItem?

StackOverflow https://stackoverflow.com/questions/1123053

Вопрос

У меня есть представление, которое используется в каждом из элементов моего 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 будет десериализован для каждой ячейки, и все розетки будут установлены.

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