如何使用Xcode 4绑定到Cocoa中的自定义视图?

dbr*_*dbr 14 cocoa objective-c cocoa-bindings xcode4

在编写Mac应用程序和使用Cocoa时,我是初学者,所以请原谅我的无知.

我正在寻找创建一个自定义视图,它暴露了一些属性,然后我可以绑定到NSObjectController.由于它是一个自定义视图,Bindings Inspector显然没有列出我添加到视图中的任何属性,然后我可以使用Interface Builder绑定到这些属性.

在转向Stackoverflow/Google寻求帮助之后,我偶然发现了几个可能的解决方案,但似乎两者都不适合我的情况.第一个建议创建一个IBPlugin,这意味着我的绑定将在Bindings Inspector中提供.然后,我可以使用IB将视图绑定到控制器.显然,Xcode 4不支持IBPlugins,所以一个人不在窗外.我也假设(可能是错误地)不再支持IBPlugins,因为这些天有更好的方法来做这些事情?

第二个选项是以编程方式将控制器绑定到视图.我对如何实现这一点感到有点困惑.是否需要子类化NSObjectController,以便我可以添加绑定到视图的调用?我是否需要在视图中添加任何内容以支持此操作?我见过的一些例子说你需要覆盖bind方法,而其他人则说你没有.

另外,我注意到[self exposeBinding:@"bindingName"]初始化程序中有一些示例自定义视图调用.根据我从各种来源收集的内容,这与IBPlugins有关,如果我不使用它,我不需要这样做.那是对的吗?

我在这里找到了一篇关于Stackoverflow的帖子,似乎讨论了与我的问题非常相似的内容,但对于最佳答案没有任何明确的赢家.noa在9月12日的最后评论似乎很有趣,尽管他们提到你应该打电话exposeBinding:.这条评论是否正确?是否真的需要对exposeBinding进行调用?

为任何愚蠢的问题道歉.任何帮助非常感谢.

Pet*_*sey 16

第一个建议创建一个IBPlugin,这意味着我的绑定将在Bindings Inspector中提供.然后,我可以使用IB将视图绑定到控制器.显然,Xcode 4不支持IBPlugins,所以一个人不在窗外.

正确.Interface Builder已经死了; Xcode nib编辑器很长时间(有时它们仍称为Interface Builder).

随着IB的消失,IBPlugins也是如此.

我也假设(可能是错误地)不再支持IBPlugins,因为这些天有更好的方法来做这些事情?

不.

第二个选项是以编程方式将控制器绑定到视图.我对如何实现这一点感到有点困惑.

发送视图一个bind:toObject:withKeyPath:options:消息.

是否需要子类化NSObjectController,以便我可以添加绑定到视图的调用?

不是NSObjectController,而是拥有nib的东西(例如窗口控制器或视图控制器)或者是其中的顶级对象(例如MainMenu nib中的应用程序委托).

我是否需要在视图中添加任何内容以支持此操作?

见下文.

我见过的一些例子说你需要覆盖bind方法,而其他人则说你没有.

你习惯于,对于非视图(视图总是工作而不会覆盖它),但不再是.您不再需要覆盖该bind::::方法.

我不知道什么时候改变了,但是我写了一个测试应用来确认当前的行为(截至Snow Leopard和Lion).

另外,我注意到[self exposeBinding:@"bindingName"]初始化程序中有一些示例自定义视图调用.根据我从各种来源收集的内容,这与IBPlugins有关,如果我不使用它,我不需要这样做.那是对的吗?

不.

您无需覆盖bind::::以绑定到任何符合KVC-/KVO标准的属性,并且您无需发送exposeBinding:.

令人困惑的是,该文件说,否则:你必须覆盖bind::::unbind:,甚至在观点,那exposeBinding:是任何有用的东西.

要创建可用绑定,您只需实现符合KVC/KVO标准的属性即可.如果它是合成的@property,那就完成了.否则,请看这里.

然后,向视图/对象发送一条bind::::消息以实际绑定它,因为无法在nib编辑器中公开绑定.

TL; DR:

只是实现一个普通的属性,你就可以用它绑定一个bind:toObject:withKeyPath:options:消息(雪豹和狮子至少).您无需再exposeBinding:从任何地方发送邮件.您无法在Xcode 4的nib编辑器中显示自定义绑定.


Ale*_*ray 6

详细阐述/澄清/颂扬@PeterHosey的答案.. 我冒昧地试用他的测试应用程序,努力弄清楚我能够想出绑定视图属性的唯一方式......在"现代"中 (不),后IBPlugin (RIP)时代......整个应用程序在3个方法中完成,子类中NSView附加了一些绑定.

在此输入图像描述

为了让视图"更新视图"而不必乱用hueDegrees属性的setter ..我只是这样做...

- (void) didChangeValueForKey:(NSString*)key {
     self.needsDisplay = YES; [super didChangeValueForKey:key]; }
Run Code Online (Sandbox Code Playgroud)

通过这样做,并在IB中设置属性的初始值,如此...

在此输入图像描述

你消除了很多胶水代码.为了让"Hue" NSTextField正确更新...因为你不能"绑定"到视图..我只需NSViewController在"对象区域"中拖动一个,然后将视图控制器的View插座连接到IB中的视图.然后通过视图控制器创建绑定.

在此输入图像描述

希望这有助于澄清 - 通过一个非常简单的解决方案 - 这个记录不佳/常常混淆的问题.