绑定:toObject:withKeyPath:选择:是单向的结合?(bind:toObject:w

2019-07-19 15:22发布

我有两个窗口:窗口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:]方法只适用于单向绑定。 我找不到可可单证一个明确的解释。 没有任何一个有这个问题的经验? 如何实现双向代码绑定?

Answer 1:

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 })];


Answer 2:

是的, 绑定: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}];


文章来源: bind:toObject:withKeyPath:options: is one-way binding?