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编辑器中公开绑定.
只是实现一个普通的属性,你就可以用它绑定一个bind:toObject:withKeyPath:options:
消息(雪豹和狮子至少).您无需再exposeBinding:
从任何地方发送邮件.您无法在Xcode 4的nib编辑器中显示自定义绑定.
详细阐述/澄清/颂扬@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中的视图.然后通过视图控制器创建绑定.
希望这有助于澄清 - 通过一个非常简单的解决方案 - 这个记录不佳/常常混淆的问题.
归档时间: |
|
查看次数: |
3929 次 |
最近记录: |