【问题标题】:Binding to a property with Cocoa Bindings that is only available in a subclass使用 Cocoa 绑定绑定到仅在子类中可用的属性
【发布时间】:2018-04-12 09:41:28
【问题描述】:

来自 WPF 的以下问题总是一件容易的事:

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

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

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

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

但是如何将第二个文本字段绑定到 nickName 属性而不会崩溃?由于 nickName 仅在 subClassB 上可用,必须做些什么才能使绑定仅在“选择” subClassB 实例时才被评估?是否应该通过隐藏/启用绑定来切换?

感谢您的帮助!

【问题讨论】:

    标签: swift cocoa cocoa-bindings


    【解决方案1】:

    为您的 UI 创建一个类别/扩展,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 }
            }
    }
    

    您可以将视图的启用/可见属性绑定到hasNickName,并将任何值绑定到editableNickName,这对于subClassB 的对象是有效的,但对于baseClass 对象是无用的属性。

    【讨论】:

    • 脚注:如果您有其他设置 nickName 的代码,您将需要一些 KVO 魔法来确保 editableNickName 获得必要的属性更改通知。
    • 这真的是唯一的解决方案吗?对于这样一个简单的问题,这看起来非常混乱......我的意思是,您使用扩展的方法很好,但是在将 Cocoa 与 WPF 绑定进行比较时,Cocoa 并没有为您解决这个问题这一事实非常令人失望。
    • @barnacleboy 您还可以查看将NSRaisesForNotApplicableKeysBindingOption 绑定选项设置为false 是否足够。
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多