我有两个窗口:窗口A是从NIB加载的;窗口 B 是通过编程创建的。
两个窗口都有一个NStextView:窗口A中textview的attributedString绑定到属性text
一个模型的using IB;而窗口B中textview的attributedString绑定到text
模型的属性使用-[NSObject bind:toObject:withKeyPath:options:]
method.
[textview bind:@"attributedString"
toObject:obj
withKeyPath:@"text"
options:nil];
这是奇怪的事情:窗口 B 中的 textview 确实绑定到obj.text
,但是文本视图中的更改永远不会更新为obj.text
。但是,如果我在窗口 A 的文本视图中进行更改,obj.text
窗口 B 中的文本视图也会相应更新。
所以我在想,-[NSObject bind:toObject:withKeyPath:options:]
方法仅适用于单向绑定。我在 Cocoa 文档中找不到明确的解释。有人有解决这个问题的经验吗?如何在代码中实现双向绑定?
Cocoa 绑定本质上是双向的,但某些行为(例如文本字段的连续/实时更新)需要设置特定选项。在 IB 中,您需要确保选中“连续更新值”复选框。要以编程方式获得等效行为,您需要指定options
装订上。这可能看起来像这样:
[textview bind: NSAttributedStringBinding
toObject: obj
withKeyPath: @"text"
options: (@{
NSContinuouslyUpdatesValueBindingOption : @YES })];
值得一提的是,当以编程方式设置绑定时,值得检查 IB 中的等效绑定并确保将所有相同的设置传递给编程绑定。例如,我在 IB 中看到,对于 NSTextView 的属性字符串绑定,默认情况下都会选中“允许编辑多个值选择”、“有条件设置可编辑”和“针对不适用的键引发”选项。这意味着我们的程序化绑定可能应该really看起来像:
[textview bind: NSAttributedStringBinding
toObject: obj
withKeyPath: @"text"
options: (@{
NSContinuouslyUpdatesValueBindingOption : @YES,
NSAllowsEditingMultipleValuesSelectionBindingOption : @YES,
NSConditionallySetsEditableBindingOption : @YES,
NSRaisesForNotApplicableKeysBindingOption : @YES })];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)