2

我有一个自定义类(的子类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];

有任何想法吗?

4

1 回答 1

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 的文档

于 2012-04-14T16:34:05.800 回答