2

我有一个NSView子类,我想公开一个属性(NSGradient确切地说是一个),以便我可以将它与其他对象绑定(以编程方式使用该bind:toObject:withKeyPath:options:方法)。

我应该采取哪些步骤?

这是我所做的:

+(void)initalize {
  [self exposeBinding:@"gradient"];
}
- (Class)valueClassForBinding:(NSString*)binding {
  if ([binding isEqualToString:@"gradient"]) { return([NSGradient class]); }

  return(nil);
}
-(NSArray*)exposedBindings {
  return([NSArray arrayWithObjects:@"gradient",nil]);
}

我不介意绑定没有显示在 Interface Builder 中。这gradient是一个实现的属性@property (nonatomic, retain) NSGradient* gradient,它在当前实现中运行良好。

只需要上面的代码来实现吗?(这似乎太容易了)我相信我错过了一些东西。

注意:我不是 Bindings 专家,但我在大部分 Objective-C 方面都做得很好。

4

1 回答 1

2

要绑定的属性必须是 KVO 和 KVC 兼容的;这实质上就是所有必要的。以您的方式声明属性,然后@synthesizeing 他们或做一些等效的事情就足够了。

bind:toObject:withKeyPath:options:出于某种原因,这只是一种方式,因此您必须使用 KVC 作为 Tom Dalling 注释来传播值。对-bind:etc消息接收者所做的更改必须手动传播。

据我所知-exposeBinding:,在 Xcode 4 中并没有真正做任何事情,也没有必要,因为 IB 不再支持插件。从文档中:

在大多数情况下,您需要使用 bind:toObject:withKeyPath:options:,然后仅当您以编程方式建立绑定时。解除绑定的使用:在“解除绑定”中讨论。其他方法——类方法exposeBinding: 和实例方法exposedBindings 和valueClassForBinding:——仅在Interface Builder 面板中有用。

据我所知,只要您使用-bind:toObject:withKeyPath:options:. 您将保留该代码以在 Interface Builder 中公开绑定,但由于我们现在是 2012 年,IB 不再有插件......

于 2012-06-08T19:37:55.300 回答