5

我有点迷路了:我创建了一个按钮,就像一个 colorPicker:点击它会在弹出窗口中显示一个 collectionView。我首先使用包含视图 + 集合视图(嵌入为滚动视图 + 剪辑视图)的 nib 文件来完成此操作。这些东西工作得很好。

由于 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)

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

有什么线索吗?

乔什

4

1 回答 1

7

使用该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添加到场景中。您还必须将对象的类设置为您的子类才能使其工作(您可以在检查器的面板上设置它)。

希望这可以帮助!

于 2016-09-15T16:27:13.237 回答