首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定:toObject:withKeyPath:options:是单向绑定吗?

绑定:toObject:withKeyPath:options:是单向绑定吗?
EN

Stack Overflow用户
提问于 2013-02-08 14:59:53
回答 2查看 3.5K关注 0票数 9

我有两个窗口:窗口A是从NIB加载的;窗口B是以编程方式创建的。

两个窗口都有一个NStextView:窗口A中文本视图的attributedString绑定到使用IB的模型的属性text;而窗口B中的textview的attributedString被绑定到使用-[NSObject bind:toObject:withKeyPath:options:]方法的模型的text属性。

代码语言:javascript
复制
[textview bind:@"attributedString"
      toObject:obj
   withKeyPath:@"text"
       options:nil];

奇怪的是:窗口B中的文本视图确实绑定到obj.text,但是文本视图中的更改从未更新到obj.text。但是,如果我更改了窗口A的文本视图,则相应地更新窗口B中的obj.text和textview。

所以我想,-[NSObject bind:toObject:withKeyPath:options:]方法只适用于单向绑定.我在可可文献中找不到明确的解释。有没有人有这个问题的经验?如何在代码中实现双向绑定?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-14 02:20:04

可可绑定本质上是双向的,但是某些行为(如文本字段的连续/实时更新)需要设置特定的选项。在IB中,您需要确保选中“持续更新值”复选框。要以编程方式获得等效行为,您需要在绑定上指定options。看起来可能是这样的:

代码语言:javascript
复制
[textview bind: NSAttributedStringBinding 
      toObject: obj 
   withKeyPath: @"text" 
       options: (@{ 
                 NSContinuouslyUpdatesValueBindingOption : @YES })];

值得一提的是,当以编程方式设置绑定时,值得在IB中检查等效的绑定,并确保将所有相同的设置传递给编程绑定。例如,我在IB中看到,对于NSTextView的属性字符串绑定,默认情况下,“允许编辑多个值选择”、“条件设置可编辑”和“为不适用的键引发”选项都会被选中。这意味着我们的编程绑定可能实际上应该如下所示:

代码语言:javascript
复制
[textview bind: NSAttributedStringBinding 
      toObject: obj 
   withKeyPath: @"text" 
       options: (@{ 
                 NSContinuouslyUpdatesValueBindingOption : @YES,
                 NSAllowsEditingMultipleValuesSelectionBindingOption : @YES,
                 NSConditionallySetsEditableBindingOption : @YES,
                 NSRaisesForNotApplicableKeysBindingOption : @YES })];
票数 5
EN

Stack Overflow用户

发布于 2015-02-27 07:50:04

是的,bind: toObject: withKeyPath: options:是一种方式,没有任何选项可以影响这一点。这与在.nib文件中进行绑定是不一样的。像往常一样,苹果忘了在它的文档中提到这样简单的事情。这里最简单的解决方案是在创建前向绑定的同时创建反向绑定。在分配值时,这不会死循环您的代码。下面是用户默认值的示例:

代码语言:javascript
复制
// 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}];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14775326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档