【问题标题】:What is needed to manually expose bindings on a custom NSView?在自定义 NSView 上手动公开绑定需要什么?
【发布时间】:2012-06-12 20:12:25
【问题描述】:

我有一个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 方面都做得很好。

【问题讨论】:

标签: objective-c xcode macos xcode4 cocoa-bindings


【解决方案1】:

要绑定的属性必须符合 KVO 和 KVC;本质上,这就是所有必要的。以您的方式声明该属性,然后 @synthesizeing 他们或做类似的事情就足够了。

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

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

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

据我所知,只要您使用-bind:toObject:withKeyPath:options:,您发布的大部分代码都不是必需的。您可以保留该代码以在 Interface Builder 中公开绑定,但由于我们现在是 2012 年,IB 不再有插件......

【讨论】:

  • 非常感谢。我得到了与 Tom Dalling 的帖子一起使用的代码,但我编写的这三个函数仍然存在。据您所知,它们是不需要的?如果我删除它们,会好吗?顺便说一句,这是我们正在讨论的代码:github.com/lsmoura/ACTGradientEditor/blob/master/…
  • 根本不需要它们;随意删除;他们所做的只是让绑定显示在 IB 中(如果适用)。您总是可以尝试将它们取出并查看它是否有效,并且应该。 [顺便说一句,Tom Dalling 的帖子仍然非常重要,因为 -bind:toObject: 仍然是一种方式,并且没有改变]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2019-04-18
  • 2011-07-09
  • 1970-01-01
  • 2020-09-17
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多