Cocoa - Где связь между NSCollectionView и NSCollectionViewItem? Ошибка Xcode 6?
Когда вы перетаскиваете NSCollectionView в представление, на раскадровке появляется NSCollectionViewItem, плавающий вокруг.
Представьте, что я перетаскиваю несколько NScollectionViews в один и тот же вид. У меня будет куча NSCollectionViewItems. Как в представлении коллекции известно, какой NScollectionViewItem принадлежит ему? Есть ли связь между двумя, которые можно увидеть на построителе интерфейса? Я ничего не вижу в построителе интерфейса? Где я могу это увидеть?
EDIT: По-видимому, это похоже на ошибку Xcode. Когда вы добавляете NSCollectionView в раскадровку, он поставляется без ссылки на NSCollectionViewItem, и между ними невозможно подключить вывод itemPrototype.
После контакта с Apple об ошибках, подобных этому, их ответ был следующим: "это проблема с Storyboards на OS X. Вместо этого используйте Xibs".
Ответы
Ответ 1
Хорошо, я дал обходное решение @RubberDuck, но это не сработало (см. мой комментарий). Для меня работала установка collectionView.itemPrototype
в viewDidLoad
контроллера вида (Xcode 6.1):
@IBOutlet weak var collectionView: NSCollectionView!
override func viewDidLoad() {
// don't forget to set identifier of CollectionViewItem
// from interface builder
let itemPrototype = self.storyboard?.instantiateControllerWithIdentifier("collectionViewItem")
as NSCollectionViewItem
self.collectionView.itemPrototype = itemPrototype
}
Ответ 2
Я не мог получить принятый ответ от @mostruash, чтобы работать в Objective-C, но я придумал другое обходное решение. Используйте специальный настраиваемый элемент для свойства collectionView IBOutlet:
- (void)setCollectionView:(NSCollectionView *)collectionView {
NSCollectionViewItem *itemPrototype = [self.storyboard instantiateControllerWithIdentifier:@"collection_item"];
collectionView.itemPrototype = itemPrototype;
_collectionView = collectionView;
}
Ответ 3
Да, после нескольких часов борьбы я подтверждаю это еще один из ошибок Xcode.
Единственное решение - отредактировать файл Main.storyboard и добавить эту строку в конец раздела CollectionView, перед </collectionView>
:
<connections>
<outlet property="itemPrototype" destination="XXXXXXX" id="Kaa-2J-b4e"/>
</connections>
где XXXXXX является идентификатором или CollectionViewItem. Другой номер, и вы можете сохранить тот, который я публикую, если этот идентификатор уже не используется вашим проектом, но шансы на это очень тусклые.
Ответ 4
Выбранный ответ требует дополнительной информации:
Если вы создаете привязку к содержимому коллекцииViewView для элементов массива, упорядоченных по объектам, используя привязки построителя интерфейса, он будет вызывать ошибку: "Прототип элемента NSCollectionView не должен быть nil".
Это связано с тем, что привязки выполняются до назначения элемента ItemPrototype. Вместо этого создайте привязки с кодом после назначения itemPrototype.
@IBOutlet weak var collectionView: NSCollectionView!
@IBOutlet var arrayController: NSArrayController!
let itemPrototype = self.storyboard?.instantiateControllerWithIdentifier("collectionViewItem")
as NSCollectionViewItem
self.collectionView.itemPrototype = itemPrototype
collectionView.bind("content", toObject: arrayController, withKeyPath: "arrangedObjects", options: nil)
Ответ 5
Я попадаю в один и тот же показатель, так или иначе, начиная с 10.11 Apple Documents сообщает:
"Вы также должны отключить и отбросить NCPollectionViews" itemPrototype ", который является остатком модели API 10.10 и более ранних версий."
от:
https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11CollectionView
здесь объясняется, как это работает сейчас.
Итак, мы должны использовать старые любимые XIBS:
NSCollectionViewItem *item = [collectionView makeItemWithIdentifier:@"Thing" forIndexPath:indexPath];
Ответ 6
NSCollectionView
имеет выход itemPrototype
, который подключен к его конкретному NSCollectionViewItem
. Это можно увидеть в инспекторе соединений для любого объекта.
Ответ 7
Перейдите в библиотеку объектов (в правом нижнем углу Xcode) и найдите "Объект". Он "Предоставляет экземпляр подкласса NSObject, который недоступен в Interface Builder". Перетащите его в раскадровку на верхнюю панель ViewController (или, альтернативно, под ViewController в древовидном представлении на LHS.) Затем нажмите на этот объект, а в "Identity Inspector" установите его класс как ваш класс ViewItem. Затем вы можете ctrl + перетащить из представления коллекции в Object, и это позволит вам подключить его как "itemPrototype".