Ошибка утверждения при использовании NSCollectionView

В настоящее время я разрабатываю приложение OS X с помощью Swift. Я пытаюсь использовать NSCollectionView в своем основном представлении, поэтому я добавил объект NSCollectionView в свой файл .xib. Я ничего не изменил в этом отношении, кроме привязки источника данных и делегирования к владельцу файла.

Это код, который я написал для реализации протокола NSCollectionViewDataSource:

/// MARK: - NSCollectionViewDataSource
extension MainViewController: NSCollectionViewDataSource {
  func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
    return 10
  }

  func collectionView(collectionView: NSCollectionView, itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem {
    let itemView = collectionView.makeItemWithIdentifier("fileItem", forIndexPath: indexPath)
    itemView.textField!.stringValue = "TEST"

    return itemView
  }

}

Теперь, когда я запускаю свой код, я получаю неперехваченное исключение, и приложение падает, и я не знаю, почему. Вот часть трассировки стека, которую я считаю полезной:

2016-04-02 18:58:02.768 Pilot[5442:679789] *** Assertion failure in -[NSCollectionView setItemPrototype:], /Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1404.46/Binding.subproj/NSCollectionView.m:1286
2016-04-02 18:58:02.971 Pilot[5442:679789] An uncaught exception was raised
2016-04-02 18:58:02.971 Pilot[5442:679789] Use -registerNib:forItemWithIdentifier: and -registerClass:forItemWithIdentifier: with new CollectionViews

Любая помощь будет принята с благодарностью.


person Rohan    schedule 03.04.2016    source источник
comment
Вы зарегистрировали fileItem либо с помощью registerNib, либо с помощью registerClass? Или иным образом создал/связал его в файле .xib?   -  person PRB    schedule 03.04.2016
comment
@PRB Я нигде не регистрировал fileItem. Это может быть проблемой. Я не совсем уверен, что означает этот параметр и как мне его зарегистрировать.   -  person Rohan    schedule 04.04.2016
comment
Если вы использовали раскадровку для разработки своего макета, внутри представления коллекции должна быть ячейка представления коллекции. Перейдите к инспектору атрибутов (справа, представление «Утилиты» раскадровки) и дайте ячейке идентификатор fileItem (в представлении многократного использования коллекции).   -  person PRB    schedule 05.04.2016
comment
Если вы использовали отдельный NIB для своей ячейки, вам понадобится что-то вроде этого в вашем ViewDidLoad() fn для контроллера представления: // Загрузите дескриптор Cell и зарегистрируйте его в CollectionView let collectionCellNib = UINib(nibName: CollectionViewCell, bundle : nil) collectionView?.registerNib(коллекцияCellNib, forCellWithReuseIdentifier: collectionViewCellIdentifier)   -  person PRB    schedule 05.04.2016


Ответы (1)


Вы должны зарегистрировать пользовательские представления следующим образом:

collectionView.register(MyFileCollectionViewItem.self, forItemWithIdentifier: "fileItem")

перед загрузкой любых элементов в представление коллекции (рекомендую в том же блоке, в котором он создан, или в viewDidLoad() его контроллера).

person Ky Leggiero    schedule 09.01.2017