Cocoa以编程方式绑定+不更新值?

时间:2012-04-14 13:06:37

标签: objective-c cocoa cocoa-bindings

我有一个自定义类(NSView的子类 - 实际上让我们说一个修改过的编辑器,但不是NSTextView的子类)我以编程方式绑定到NSArrayController (我绝对不能通过Interface Builder这样做),像这样:

[myEditor bind:@"string" 
     toObject:myController 
  withKeyPath:@"selection.content" 
      options:nil];

以上是有效的,但是当值发生变化时,它不会更新到我的NSArrayController - 就像它没有“坚持”一样。

我甚至尝试过使用下面的options,但无济于事:

NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES],NSContinuouslyUpdatesValueBindingOption, 
                         [NSNumber numberWithBool:YES],NSAllowsEditingMultipleValuesSelectionBindingOption,
                         [NSNumber numberWithBool:YES],NSConditionallySetsEditableBindingOption,
                         [NSNumber numberWithBool:YES],NSRaisesForNotApplicableKeysBindingOption,
                         nil];

有什么想法吗?

1 个答案:

答案 0 :(得分:8)

类必须实现对绑定的支持。 Cocoa附带的视图和单元类通常实现一组特定的绑定。自定义子类是否起作用取决于实现者。

如果某个类未对绑定实施特定支持,则-bind:...请求将落实到NSObject的实施。但是,这种实施非常有限。它观察 observableController 的关键路径,并通过KVC更新接收器的属性,该接收器具有与绑定相同的名称。但它确实走向另一个方向。也就是说,接收器上属性的更改不会通过密钥路径转发到observableController。

使用您的示例使这不那么抽象。如果myEditor的类没有专门实现对&#34;字符串&#34;的支持。绑定,然后NSObject的实现将[myController addObserver:<some private observer object> forKeyPath:@"selection.content" options:<...> context:<...>]

当私人观察者对象收到更改通知时,它将执行[myEditor setValue:[myController valueForKeyPath:@"selection.content"] forKey:@"string"]

但是,NSObject不会尝试观察myEditor&#34;字符串&#34;财产也从不致电[myController setValue:<...> forKeyPath:@"selection.content"]

要详细了解如何实施对绑定的支持,请参阅Apple's documentation