我有一个自定义类(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];
有什么想法吗?
答案 0 :(得分:8)
类必须实现对绑定的支持。 Cocoa附带的视图和单元类通常实现一组特定的绑定。自定义子类是否起作用取决于实现者。
如果某个类未对绑定实施特定支持,则-bind:...
请求将落实到NSObject
的实施。但是,这种实施非常有限。它观察 observableController 的关键路径,并通过KVC更新接收器的属性,该接收器具有与绑定相同的名称。但它确实不走向另一个方向。也就是说,接收器上属性的更改不会通过密钥路径转发到observableController。
使用您的示例使这不那么抽象。如果myEditor
的类没有专门实现对"字符串"的支持。绑定,然后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。