NSCollectionViewItem имеет ноль выходов в itemForRepresentObjectAtIndexPath

У меня есть NSCollectionView, который отображает набор элементов, которые называются «ImageCollectionViewItem». У меня есть файл ImageCollectionViewItem.xib, в котором есть только NSView, покрывающий элемент. Я хочу иметь возможность динамически изменять то, что находится в этом представлении, но когда я пытаюсь ссылаться на него, это ноль. Я уже проверял такие вопросы, как: выходы в UIViewController nil в viewdidload, это не моя проблема, я связал ее и у меня залитый кружок

Вот расширение viewcontroller:

extension ViewController : NSCollectionViewDataSource {

    func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
        return titles.count
    }
    func collectionView(collectionView: NSCollectionView, itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem {
        let item = collectionView.makeItemWithIdentifier("ImageCollectionViewItem", forIndexPath: indexPath) as! ImageCollectionViewItem

        //This is what is nil:
        let thisView = item.iconView

        return item
    }

}

А вот и код ImageViewCollectionItem.

class ImageCollectionViewItem: NSCollectionViewItem {

    @IBOutlet weak var iconView: NSView!

    var numItem: Int?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.

        view.wantsLayer = true
        view.layer?.backgroundColor = NSColor.whiteColor().CGColor
    }
}

person connormurray7    schedule 01.06.2016    source источник


Ответы (1)


Это определенно странная вещь в мире Какао. Но вот некоторый поток, который должен помочь. Откройте свой ImageCollectionViewItem.xib в Интерфейсном Разработчике и перетащите «Элемент представления коллекции» из библиотеки объектов, затем выберите его и установите имя своего пользовательского класса на ImageCollectionViewItem, после чего makeItemWithIdentifier должен создать элемент, отличный от нуля.

В моем примере у меня есть класс Tile:

 class Tile: NSCollectionViewItem {

А вот как я создаю плитки:

func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {

    return items.count
}


func collectionView(collectionView: NSCollectionView,
                    itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem {

    let item = collectionView.makeItemWithIdentifier("Tile", forIndexPath: indexPath) as! Tile
    return item


}

Вот изображение ИБ:

введите описание изображения здесь

Если вы выполните эти шаги, ваши розетки будут подключены после создания. В моем случае у меня 2 розетки:

class Tile: NSCollectionViewItem {

@IBOutlet weak var bigScrollView: ItemScrollView!
@IBOutlet weak var smallScrollView: ItemScrollView!

override func awakeFromNib() {
    super.awakeFromNib()
}

override func viewDidAppear() {
    //
}

}

И они оба связаны, как вы можете видеть на картинке:

введите описание изображения здесь

person Eugene Mankovski    schedule 17.06.2016
comment
У меня такая же проблема, и я попробовал ваше решение, Евгений, однако я все еще получаю ноль для своего imageView. Я попытался создать новую розетку под названием myImageView, и она тоже возвращает nil. - person tjb; 16.09.2016
comment
Вы можете поделиться образцом проекта? Я уверен, что это какая-то мелочь, которую упустили из виду. Иногда случается и со мной. - person Eugene Mankovski; 17.09.2016