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

Dr.*_*eon 2 cocoa objective-c cocoa-bindings

我有一个自定义类(NSView实际上让我们说一个修改过的编辑器的子类,但不是它的子类NSTextView)我以NSArrayController编程方式绑定(我绝对不能通过Interface Builder来实现),如下所示:

[myEditor bind:@"string" 
     toObject:myController 
  withKeyPath:@"selection.content" 
      options:nil];
Run Code Online (Sandbox Code Playgroud)

上面的工作,但是当值改变时,它不会更新到我的NSArrayController- 它就好像它没有"坚持".

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

NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES],NSContinuouslyUpdatesValueBindingOption, 
                         [NSNumber numberWithBool:YES],NSAllowsEditingMultipleValuesSelectionBindingOption,
                         [NSNumber numberWithBool:YES],NSConditionallySetsEditableBindingOption,
                         [NSNumber numberWithBool:YES],NSRaisesForNotApplicableKeysBindingOption,
                         nil];
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Ken*_*ses 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"字符串"属性,也不会打电话[myController setValue:<...> forKeyPath:@"selection.content"].

要了解有关如何实现绑定支持的更多信息,请参阅Apple的文档.