在自定义 NSView 上手动公开绑定需要什么



我有一个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]);
}

我不介意绑定是否未显示在界面生成器中。gradient是使用 @property (nonatomic, retain) NSGradient* gradient 实现的属性,它与当前实现配合良好。

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

注意:我不是绑定专家,但我在大多数Objective-C上都做得很好。

要绑定的属性必须符合 KVO 和 KVC 标准;这本质上是所有必要的。以你的方式声明属性,然后@synthesize它们或做一些等效的事情就足够了。

出于某种原因,bind:toObject:withKeyPath:options:只是一种方式,因此您必须使用 KVC 传播值,正如 Tom Dalling 所指出的那样。对-bind:etc消息接收方所做的更改必须手动传播。

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

在大多数情况下,您需要使用 bind:toObject:withKeyPath:options:,以及 然后,仅当您以编程方式建立绑定时。用途 解除绑定:在"解除绑定"中讨论。其他方法 - 类 方法 exposeBinding: 和实例方法 exposedBindings 和 valueClassForBinding:— 仅在界面生成器调色板中有用。

据我所知,只要您使用-bind:toObject:withKeyPath:options:,您发布的大部分代码就不是必需的。您将保留该代码以在接口生成器中公开绑定,但由于我们现在处于 2012 年并且 IB 不再有插件......

最新更新