【问题标题】:Bind to negative of a boolean property with KVO使用 KVO 绑定到布尔属性的负数
【发布时间】:2014-01-20 22:22:44
【问题描述】:

我正在使用 KVO 来查看复选框,并根据复选框的状态启用或禁用详细信息输入区域。 (即,如果选中复选框,则启用详细信息区域,否则不启用)类似:

[self.detailInputArea bind:@"enabled" toObject:self withKeyPath:@"enabledCheckbox" options:nil];

我的问题是,现在我想将其更改为设置detailInputAreahidden 属性,以根据复选框的状态显示/隐藏视图。问题是这需要逆逻辑。换句话说,当设置它的enabled, true 意味着视图被启用(可以接受输入),而 false 意味着它不能。但是,hidden, true 表示视图被隐藏,否则为 false。显然这是行不通的,因为当复选框被选中时视图会隐藏自己(它的enabled 属性为 true)。

有什么方法可以更改此绑定以根据它正在观察的属性的反面进行操作,和/或有没有更好的方法来完成我在这里尝试做的事情?

【问题讨论】:

    标签: cocoa cocoa-bindings key-value-observing


    【解决方案1】:

    是的,这是选项字典的一部分。键值绑定允许绑定值在设置之前通过NSValueTransformer 进行转换,您可以在绑定的选项中指定转换器。

    NSValueTransformer 类提供some default, named transformers。在这种情况下,您将对NSNegateBooleanTransformerName 感兴趣。

    因此您想要的绑定将如下所示:

    [self.detailInputArea bind:@"hidden" 
                      toObject:self 
                   withKeyPath:@"enabledCheckbox" 
                       options:@{NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName}];
    

    【讨论】:

    • 呃,我讨厌混淆 NSValueTransformerNameBindingOption NSValueTransformerBindingOption 这样的东西。太频繁了,在这种时候我......想去寻找......我的枪。
    【解决方案2】:

    这是 Swift 3 中的 Josh Caswell's answer

    detailInputArea.bind(NSHiddenBinding,
                         to: self,
                         withKeyPath: #keyPath(enabledCheckbox),
                         options: [NSValueTransformerNameBindingOption: NSValueTransformerName.negateBooleanTransformerName])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2011-08-26
      • 2016-09-26
      相关资源
      最近更新 更多