Cocoa bind:toObject:withKeyPath:options:是单向绑定吗?

Cocoa bind:toObject:withKeyPath:options:是单向绑定吗?,cocoa,binding,cocoa-bindings,nstextview,Cocoa,Binding,Cocoa Bindings,Nstextview,我有两个窗口:窗口A从NIB加载;窗口B是以编程方式创建的 两个窗口都有一个NStextView:窗口a中textview的attributedString使用IB绑定到模型的属性text;而窗口B中textview的attributedString使用-[NSObject bind:toObject:withKeyPath:options://code>方法绑定到模型的text属性 [textview bind:@"attributedString" toObject:obj

我有两个窗口:窗口A从NIB加载;窗口B是以编程方式创建的

两个窗口都有一个NStextView:窗口a中textview的attributedString使用IB绑定到模型的属性
text
;而窗口B中textview的attributedString使用
-[NSObject bind:toObject:withKeyPath:options://code>方法绑定到模型的
text
属性

[textview bind:@"attributedString"
      toObject:obj
   withKeyPath:@"text"
       options:nil];
奇怪的是:窗口B中的textview确实绑定到了
obj.text
,但textview中的更改从未更新到
obj.text
。但是,如果我在窗口A的textview中进行了更改,则窗口B中的
obj.text
和textview将相应地更新


所以我想,
-[NSObject bind:toObject:withKeyPath:options:][/code>方法只用于单向绑定。我在可可文档中找不到清晰的解释。有人有过这个问题的经验吗?如何在代码中实现双向绑定

Cocoa绑定本质上是双向的,但某些行为(如文本字段的连续/实时更新)需要设置特定的选项。在IB中,您需要确保选中“持续更新值”复选框。要以编程方式获得等效的行为,需要在绑定上指定
选项
。可能看起来像这样:

[textview bind: NSAttributedStringBinding 
      toObject: obj 
   withKeyPath: @"text" 
       options: (@{ 
                 NSContinuouslyUpdatesValueBindingOption : @YES })];
值得一提的是,当以编程方式设置绑定时,值得检查IB中的等效绑定,并确保将所有相同的设置传递给编程绑定。例如,我在IB中看到,对于NSTextView的属性字符串绑定,“允许编辑多个值选择”、“有条件地设置可编辑”和“不适用键的提升”选项在默认情况下都被选中。这意味着我们的编程绑定应该看起来像:

[textview bind: NSAttributedStringBinding 
      toObject: obj 
   withKeyPath: @"text" 
       options: (@{ 
                 NSContinuouslyUpdatesValueBindingOption : @YES,
                 NSAllowsEditingMultipleValuesSelectionBindingOption : @YES,
                 NSConditionallySetsEditableBindingOption : @YES,
                 NSRaisesForNotApplicableKeysBindingOption : @YES })];
是的,bind:toObject:withKeyPath:options:是一种方式,没有选项可以影响这种方式。这与在.nib文件中进行绑定不同。像往常一样,苹果在其文档中忘了提到这样简单的事情。这里最简单的解决方案是在创建正向绑定的同时创建反向绑定。 分配值时,这不会死循环代码。 以下是具有用户默认值的示例:

// two way binding of MyObject.myValue to user defaults
[NSUserDefaultsController.sharedUserDefaultsController.values bind: @"myValueInDefaults"
                                                          toObject: myObject
                                                       withKeyPath: @"myValue"
                                                           options: @{@"NSContinuouslyUpdatesValue":@YES}];

[myObject bind: @"myValue"
      toObject: NSUserDefaultsController.sharedUserDefaultsController
   withKeyPath: @"values.myValueInDefaults"
       options: @{@"NSContinuouslyUpdatesValue":@YES}];

这对我来说仍然不起作用。我在这里找到了答案-->我不确定上面链接的问题的相关性。这里提到的绑定是在两个NSControl对象之间的——不需要自定义绑定实现。您所说的内在双向是什么意思?我在两个对象之间有一个只能单向工作的绑定。这是IB@JulianF.Weinert的特殊情况吗?@JulianF.Weinert我的意思是,如果控件绑定到模型对象(在常见情况下通过控制器),字段将从该模型对象填充其值(即读取),然后用户在控件中所做的任何更改都将被推回到模型对象中(即写入)。仅此而已。您知道此功能位于哪一层吗?我想应该是
NSControl
,对吧?对于vanilla
NSObject
子类,它只能单向工作。如果我需要将一个值转换为另一个值,反之亦然,我需要使用两个NSValueTransformer,对于键NSValueTransformer绑定选项,或者一个就足够了?因为这些绑定彼此不连接,我认为您需要两个NSValueTransformer,每个装订一个。但我没有使用NSValueTransformerBindingOption,也不能确定。我知道,例如从度到弧度,反之亦然,我认为需要两个,谢谢