使用Cocoa绑定绑定到属性,该绑定仅在子类

时间:2018-04-12 09:41:28

标签: swift cocoa cocoa-bindings

来自WPF,以下问题始终是一件容易的事:

  • 我有一个名为baseClass的类,它有两个子类 subClassA和subClassB。
  • 我的视图控制器有一个名为的数组 [baseClass]类型的对象和名为selectedObject的属性 type baseClass。
  • 由于subClassA和B派生自 baseClass,我可以将两种类型的实例放入数组对象和selectedObject属性中。

现在我要创建一个用于编辑这些类的UI。它由以下内容组成:

  • 使用NSArrayController获取对象数组的NSPopupButton。
  • 一个文本框,用于编辑名为name的属性,在baseClass中声明。
  • 一个文本框,用于编辑名为nickName的属性,在subClassB中声明。

我已经实现了在弹出按钮中显示对象数组的内容并将选择绑定到ViewController的selectedObject。此外,我插入了一个文本字段并连接了所有内容,以便name属性正常工作(self.ViewController.selectedObject.name)。

但是如何将第二个文本字段绑定到nickName属性而不会崩溃?由于nickName仅在subClassB上可用,因此只有在subClassB实例被选中时才需要做什么才能进行绑定"?是否应通过隐藏/启用绑定切换?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

为了您的用户界面,为baseClass创建一个类别/扩展程序。在此扩展中,定义两个计算属性(未经测试,在浏览器中键入):

extension baseClass {
    var hasNickName: Bool { return (self as? subClassB) != nil }
    var editableNickName: String? {
        get { return (self as? subClassB)?.nickName }
        set(newName) { (self as? subClassB)?.nickName = newName }
        }
}

您可以将视图的enabled / visible属性绑定到hasNickName,并将任何值绑定到editableNickName,这对subClassB的对象起作用,但{{1}为无效属性对象。