我在这里有点迷失:
我创建了一个像 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)
项目未初始化,正如调试器在我介入时所说的那样(不是零,未初始化的)。显然, makeItem 方法永远不会实例化我创建的子类中的任何 collectionViewItem 。
标识符很好,并且调用了 collectionView.register 函数,就像在 nib 版本中一样,因为两个项目在这些方面是相同的。 makeItem 函数根本不调用我子类化的 NSCollectionViewItem 的 loadView 方法。
有什么线索吗?
Josh
随着collectionView.makeItem(withIdentifier:for:)
方法,您首先需要使用集合视图注册类或 nib 文件:
使用类
Use register(_:forItemWithIdentifier:)
(第一个参数接受AnyClass?
)
collectionView.register(MyCustomCollectionViewItemSubclass.self, forItemWithIdentifier: "SomeId")
使用 Nib 文件
Use register(_:forItemWithIdentifier:)
(第一个参数接受NSNib?
).
let nib = NSNib(nibNamed: "MyCollectionViewItem", bundle: nil)!
collectionView.register(nib, forItemWithIdentifier: "SomeId")
关键是:在你的 Nib 文件上,你还必须确保你有一个NSCollectionViewItem
添加到场景中。您还必须将对象的类设置为您的子类才能使其工作(您可以在检查器面板上设置它)。
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)