Cocoa bind:toObject:withKeyPath:options:是单向绑定吗?
我有两个窗口:窗口A从NIB加载;窗口B是以编程方式创建的 两个窗口都有一个NStextView:窗口a中textview的attributedString使用IB绑定到模型的属性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
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
,对吧?对于vanillaNSObject
子类,它只能单向工作。如果我需要将一个值转换为另一个值,反之亦然,我需要使用两个NSValueTransformer,对于键NSValueTransformer绑定选项,或者一个就足够了?因为这些绑定彼此不连接,我认为您需要两个NSValueTransformer,每个装订一个。但我没有使用NSValueTransformerBindingOption,也不能确定。我知道,例如从度到弧度,反之亦然,我认为需要两个,谢谢