2016-06-28 73 views
1

我有一个问题,它似乎我能够将项目添加到集合视图,并具有我从NSCollectionViewItem的子类创建的原型单元格,但是当我尝试按顺序更改标签显示数据是因为它们是零,即使我将它们从界面构建器连接起来,也会得到错误。IBOutlets在NSCollectionViewItem是零

我也通过向单元格攻击mouseup函数进行打印检出了representObject属性,并且它工作正常。当我试图分配显然不存在的插座的stringValue时,它只会分崩离析。

楼下,你可以看到我的故事板和控制该项目的意见。 标签对象在下面表示为两个@IBOutletsrepresentedObject正在别名为var morpheme : Morpheme? Storyboard view

在这里,在主窗口控制器我测试了刚刚加入Morpheme对象集合与我想用填充标签测试值。 Main Window Code

显示屏显示在列表中的细胞,但是当我点击他们崩溃,由于从表面上未初始化网点nil值。如果您在控制台中查看Morpheme 3已成功打印,则数据模型已将其打印出来。是否还需要执行其他任何操作?有很多关于使用绑定菜单漂浮的东西,但我还没有发挥它周围很多。 Error display

回答

1

也就是说它已经获得了相当的影响力非常有趣的问题。这个问题似乎是在可可个bug,因此当项目从原型创建的,其网点不上瘾。

查找创建原型时,会发生什么:

enter image description here

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

enter image description here

所以,我的建议是使用一种2个解决方案:

  1. 使用nibs和NSCollectionViewDataSource基于视图创建集合视图项目。寻找最后的答案在这里: Cocoa - Where is the link between a NSCollectionView and a NSCollectionViewItem? Xcode 6 Bug?

或者只是看到关键字例子:“makeItemWithIdentifier”

  • 不使用网点和使用数据绑定,我做了我例。我结合我的文字编辑,以代表对象:
  • 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

    +0

    谢谢!这有助于初步的绑定问题。现在看来我仍然有一些问题,列表仍然显示空白,我发现这是因为当单元格试图显示他们的数据('语素'对象)没有设置,所以他们是打开'nil'。稍后当我点击它们时,我可以让它们打印到控制台,但当代表性对象最终可用时,标签不会更新。 – Alexandstein

    +1

    对于绑定系统来跟踪更改,您必须使用dynamic关键字:dynamic var morpheme:语素?或者如果有明确的设置,你应该让他们知道调用KVC前/后函数:willChangeValueForKey(“语素”) representObject = newValue didChangeValueForKey(“语素”)Morpheme对象内任何封闭属性的相同故事东西给他们) –

    +0

    看起来像它的工作。谢谢!它看起来像我错误的一个小细节是使用'viewWillAppear()'而不是'viewDidLoad()'。我不确定触发顺序是什么,导致绑定同步问题。 – Alexandstein