NSCollectionViewItem中的IBOutlets为零

时间:2016-06-28 07:17:05

标签: swift macos cocoa swift2

我遇到的问题似乎是我能够将项目添加到集合视图中,并且拥有我从NSCollectionViewItem的子类创建的原型单元格,但是当我尝试更改标签以显示来自即使我从界面构建器连接它们,因为它们是零,所以会得到错误。

我还通过将一个mouseup函数攻击到单元格来检查representObject属性,并且它工作正常。当我尝试分配显然不存在的出口的stringValue时,它才会崩溃。

在下面,您可以看到我的故事板和项目视图的控制器。 Label对象在下面表示为两个@IBOutletsrepresentedObject被别名为var morpheme : Morpheme? Storyboard view

在主窗口控制器中,我正在测试只是将Morpheme对象添加到集合中,其中包含我想要填充标签的测试值。 Main Window Code

显示屏显示列表中的单元格,但是当我单击它们时,由于来自显然未实例化的插座的nil值,它会崩溃。如果您在控制台中查看Morpheme 3已成功打印,那么数据模型就会显示出来。还有什么我需要做的吗?有很多关于使用绑定菜单的东西,但我没有玩过很多东西。 Error display

1 个答案:

答案 0 :(得分:1)

这是一个非常有趣的问题,已经获得了很多牵引力。问题似乎是Cocoa中的一个错误,所以当从原型创建的项目时,它们的出口不会被钩住。

看看创建原型时会发生什么:

enter image description here

然后,当创建实际实例时,出口是零:

enter image description here

所以我的建议是使用两种解决方案之一:

  1. 使用nibs和NSCollectionViewDataSource基于视图创建集合视图项。在这里寻找最后的答案: Cocoa - Where is the link between a NSCollectionView and a NSCollectionViewItem? Xcode 6 Bug?
  2. 或者只是看一下关键字的例子:“makeItemWithIdentifier”

    1. 不要像我在我的例子中那样使用outlet并使用数据绑定。我将文本编辑绑定到代表对象:
    2. enter image description here

      这是我在控制器中的代码:

      class ViewController: NSViewController {
      
      dynamic var collectionViewData = [String]()
      
      @IBOutlet weak var collectionView: NSCollectionView!
      
      override func viewDidLoad() {
          super.viewDidLoad()
      
          guard let proto = self.storyboard?.instantiateControllerWithIdentifier("collectionViewItem") as? CustomCollectionViewItem else { return }
      
          collectionView.itemPrototype = proto
      
          collectionViewData.append("One")
          collectionViewData.append("Two")
      }
      

      我的最后一张照片是(你可以看到我将标签绑定到数组中的actaul字符串):

      enter image description here