NSCollectionViewItem永远不会实例化

时间:2016-08-24 09:24:12

标签: swift macos nscollectionview nscollectionviewitem

我有点迷失在这里: 我创建了一个像colorPicker一样的按钮:单击它会在弹出框中显示一个collectionView。 我首先使用包含视图+ collectionView(嵌入在scrollView + clipView中)的nib fil。 这些东西运作得很好。

由于nib文件非常简单(并且为了提高我在编程方式设计视图时的编码技巧),我决定摆脱nib文件并在代码中编写缺失的部分。 问题是,我设法完成工作,除了collectionView的内容。经过深入调查,似乎在方法内部:

func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem

应该管理数据源,方法

collectionView.makeItem(withIdentifier: String, for: IndexPath)

不起作用。事实上,在:

let item = collectionView.makeItem(withIdentifier: ColorPickerPopover.itemIdentifier, for: indexPath)

项目未初始化,正如调试人员在我介入时所说的那样(不是nil,未初始化)。显然,makeItem方法永远不会从我所创建的子类中实例化任何collectionViewItem。 标识符很好,并且调用了collectionView.register函数,就像在nib版本中一样,因为这两个项目在这些点上是相同的。 makeItem函数根本不调用我已经子类化的NSCollectionViewItem的loadView方法。

有任何线索吗?

约什

1 个答案:

答案 0 :(得分:5)

使用collectionView.makeItem(withIdentifier:for:)方法,您首先需要使用集合视图注册类或nib文件:

使用课程

使用register(_:forItemWithIdentifier:)(第一个参数接受AnyClass?

collectionView.register(MyCustomCollectionViewItemSubclass.self, forItemWithIdentifier: "SomeId")

使用Nib文件

使用register(_:forItemWithIdentifier:)(第一个参数接受NSNib?)。

let nib = NSNib(nibNamed: "MyCollectionViewItem", bundle: nil)!
collectionView.register(nib, forItemWithIdentifier: "SomeId")

关键是:在您的Nib文件中,您还必须确保您已将NSCollectionViewItem添加到场景中。您还必须将对象的类设置为子类才能使其工作(您可以在检查器的面板上设置它)。

希望这有帮助!