Подтвердить что ты не робот

Cocoa - Где связь между NSCollectionView и NSCollectionViewItem? Ошибка Xcode 6?

Когда вы перетаскиваете NSCollectionView в представление, на раскадровке появляется NSCollectionViewItem, плавающий вокруг.

Представьте, что я перетаскиваю несколько NScollectionViews в один и тот же вид. У меня будет куча NSCollectionViewItems. Как в представлении коллекции известно, какой NScollectionViewItem принадлежит ему? Есть ли связь между двумя, которые можно увидеть на построителе интерфейса? Я ничего не вижу в построителе интерфейса? Где я могу это увидеть?

EDIT: По-видимому, это похоже на ошибку Xcode. Когда вы добавляете NSCollectionView в раскадровку, он поставляется без ссылки на NSCollectionViewItem, и между ними невозможно подключить вывод itemPrototype.

После контакта с Apple об ошибках, подобных этому, их ответ был следующим: "это проблема с Storyboards на OS X. Вместо этого используйте Xibs".

4b9b3361

Ответ 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".