2009-07-14 2 views
6

У меня есть представление, которое будет использоваться в каждой из моих элементов CollectionView. У меня есть IBOutlet для CollectionViewItem из моего представления, и я подключился к нему в Interface Builder. Я хочу получить доступ к значению из объекта createdObject (который является объектом Core Data) в моем коде представления. Вот пример того, что я пытаюсь сделать - доступ к значениям последовательности из representedObject:Как получить представленный объект из представления в NSCollectionViewItem?

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

ответ

1

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

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

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

+0

Спасибо, что сделал трюк. – Austin

+1

Я озадачен этим ответом. Во-первых, @kperryua утверждает: «Типичный шаблон для доступа к экземпляру NSCollectionViewItem - это привязка к прототипу. Вы упоминаете, что вы сделали это и что он работает». Но в вопросе Остина только упоминается использование «ключевого пути presentObject.seq», и действительно трудно понять, как привязать элемент ItemPrototype элемента collectionView к представлению коллекцииViewItem. Я говорю, что это невозможно, но я счастлив, что оказался ошибочным. Во-вторых, документация Apple для копии NSObjectWithZone: явно указывает: «Вы не должны переопределять этот метод». –

+0

Переопределение copyWithZone: вполне безопасно, пока суперклассы allocWithZone: вызывается внутри него. Не проверял, действительно ли они говорят, что не делают этого, но почему-то я думаю, что вы можете смутить его с allocWithZone: или некоторые из них. – ctpenrose

1

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

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

3) Sublcass в NSCollectionViewItem

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

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

+0

Метод setView будет устаревшим (он идентифицирован как применимый к 10.5 и 10.6 в документации Apple), хотя он вызывается в 10.7, как долго это будет продолжаться, не указывается. – rougeExciter

0

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

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