我有两个窗口:窗口A从NIB加载; 并且编程方式创建窗口B中。
这两个窗口有NStextView:窗口A TextView的是绑定到该属性的attributedString text
使用IB的典范; 而在窗口B中的TextView的attributedString势必text
使用模型的属性-[NSObject bind:toObject:withKeyPath:options:]
方法。
[textview bind:@"attributedString"
toObject:obj
withKeyPath:@"text"
options:nil];
这是奇怪的事情:在窗口B中的TextView的确被绑定到obj.text
,但在TextView的变化永远不会更新到obj.text
。 但是,如果我在窗口A的TextView的做出改变, obj.text
和窗口B中TextView的进行相应的更新。
所以我想,在-[NSObject bind:toObject:withKeyPath:options:]
方法只适用于单向绑定。 我找不到可可单证一个明确的解释。 没有任何一个有这个问题的经验? 如何实现双向代码绑定?
Cocoa绑定本质上是双向的,但某些行为(如连续/文本字段的现场更新)需要特定的选项进行设置。 在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 })];
是的, 绑定:toObject:withKeyPath:选择:是单向的,没有选项可以影响这一点。 这是不一样的您在笔尖文件结合。 像往常一样,苹果忘了提在其文档等简单的事情。 这里最简单的解决方法是创建反向,当你创建一个向前的同时绑定。 这会不会死循环代码时您指定的值。 下面是与用户默认值例如:
// 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}];