我有两个窗口:窗口A是从NIB加载的;窗口B是以编程方式创建的。
两个窗口都有一个NStextView:窗口A中文本视图的attributedString绑定到使用IB的模型的属性text;而窗口B中的textview的attributedString被绑定到使用-[NSObject bind:toObject:withKeyPath:options:]方法的模型的text属性。
[textview bind:@"attributedString"
toObject:obj
withKeyPath:@"text"
options:nil];奇怪的是:窗口B中的文本视图确实绑定到obj.text,但是文本视图中的更改从未更新到obj.text。但是,如果我更改了窗口A的文本视图,则相应地更新窗口B中的obj.text和textview。
所以我想,-[NSObject bind:toObject:withKeyPath:options:]方法只适用于单向绑定.我在可可文献中找不到明确的解释。有没有人有这个问题的经验?如何在代码中实现双向绑定?
发布于 2013-02-14 02:20:04
可可绑定本质上是双向的,但是某些行为(如文本字段的连续/实时更新)需要设置特定的选项。在IB中,您需要确保选中“持续更新值”复选框。要以编程方式获得等效行为,您需要在绑定上指定options。看起来可能是这样的:
[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 })];发布于 2015-02-27 07:50:04
是的,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}];https://stackoverflow.com/questions/14775326
复制相似问题