【问题标题】:IBOutlets in NSCollectionViewItem are nilNSCollectionViewItem 中的 IBOutlets 为零
【发布时间】:2016-10-30 09:13:57
【问题描述】:

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

我还通过对单元格的 mouseup 函数进行了打印检查了代表对象属性,它工作正常。只有当我尝试分配显然不存在的网点的 stringValue 时,它​​才会崩溃。

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

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

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

【问题讨论】:

    标签: swift macos cocoa swift2


    【解决方案1】:

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

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

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

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

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

    或者只是查看带有关键字的示例:“makeItemWithIdentifier”

    1. 不要像我在示例中那样使用插座并使用数据绑定。我将文本编辑绑定到表示的对象:

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

    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")
    }
    

    我的最终图片是(你可以看到我将标签绑定到数组中的实际字符串):

    【讨论】:

    • 谢谢!这有助于解决最初的绑定问题。现在看来我仍然有一些问题,列表仍然显示为空白,我发现这是因为当单元格尝试显示它们的数据(Morpheme? 对象)时没有设置所以他们正在转动向上nil。稍后当我单击它们时,我可以让它们打印到控制台,但是当代表对象最终可用时标签不会更新。
    • 对于绑定系统来跟踪更改,您必须使用动态关键字:dynamic var morpheme: Morpheme?或者如果有明确的设置器,您应该让他们知道调用前/后 KVC 函数: willChangeValueForKey("morpheme")他们)
    • 看起来有效。谢谢!看起来我弄错的一个小细节是使用viewWillAppear() 而不是viewDidLoad()。我不确定触发顺序是什么,这导致了绑定同步问题。
    猜你喜欢
    • 2014-11-14
    • 2011-04-29
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多