swift - NSCollectionViewItem 从不实例化

标签 swift macos nscollectionview nscollectionviewitem

我在这里有点迷路: 我创建了一个像 colorPicker 一样的按钮:单击它会在弹出窗口中显示一个 collectionView。 我首先使用包含 View + collectionView(嵌入为 scrollView + 剪辑 View )的 nib fil 来完成它。 这些东西工作得很好。

由于 nib 文件非常简单(并且为了提高我以编程方式设计 View 的编码技能),我决定摆脱 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 方法。

有什么线索吗?

乔希

最佳答案

使用 collectionView.makeItem(withIdentifier:for:) 方法,您首先需要使用 Collection View 注册类或 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 添加到场景中。您还必须将对象的类设置为您的子类才能使其正常工作(您可以在检查器面板上进行设置)。

希望这对您有所帮助!

关于swift - NSCollectionViewItem 从不实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39119345/

相关文章:

switch-statement - swift 掉落的情况

ios - Swift:cellForRowAtIndexPath 中出现意外结果

xcode - 数据绑定(bind)/NSArrayController : What is the job of the Object Controller

cocoa - 更新 NSCollectionViewItem 实例中的 NSTableView

ios - swift 4 : Set Different Date and Time

objective-c - 尝试添加行时应用程序不断崩溃?

iphone - 如何将文件导入sqlite?

ios - 网络故障后恢复时 Swift 中的通知

XCode - 如何重置/"delete"从 XCode 运行的 mac os 应用程序(类似于在 ios 模拟器中删除应用程序)?

xcode - 如何从头开始以编程方式创建 NSCollectionView?