我在实现自己的NSView子类的绑定方面遇到了麻烦.它工作正常,但是当从nib文件绑定到File的Owner时,保留周期存在问题.在阅读了一下之后,我发现Apple在几年前遇到了同样的问题,但已经修复了一些魔法未记录的类(NSAutounbinder).
这里有关于保留周期问题的冗长讨论http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600.解决方法是在释放窗口控制器之前取消绑定所有绑定,而不是在取消分配窗口控制器之前,在windowWillClose:之类的位置解除绑定.这似乎是对我不必要的黑客攻击.
我的问题是:有没有办法让自定义绑定与Apple制作的绑定一样好,而不使用未记录的功能?我是以错误的方式来做这件事的吗?
更新2:我找到了一个解决方案,允许手动实现的绑定与Apple的绑定完全一样.它利用了未记录的NSAutounbinder类,而没有实际使用未记录的功能.我将在今天晚些时候发布解决方案.
更新:我尝试过使用exposeBinding:
,似乎没有任何区别.但是,NSObject
执行bind:toObject:withKeyPath:options:
半部作品.它传播从bindee到binder的变化(即从模型/控制器到视图),但不会以相反的方式工作.此外,虽然明显地观察到了这个垃圾箱,但是observeValueForKeyPath:ofObject:change:context:
从未触发过.
示例项目:http://www.tomdalling.com/wp-content/BindingsTest.zip
Apple的文档表明,事实上,您必须覆盖bind:toObject:withKeyPath:options:
以实现手动绑定.请看:http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html
侧面注意:我已经调查了未记录的NSAutounbinder如何工作,这就是我所知道的.
当为NSWindowController创建绑定时,绑定对象实际上是一个NSAutounbinder,它是从NSWindowController获取的 - [NSWindowController _autounbinder].NSAutounbinder是NSWindowController对象的非保留代理.避免保留循环问题是不保留的.
当调用 - [NSWindowController release]并且retainCount == 1时,NSAutounbinder会解除对所有绑定的绑定.这可确保在取消分配对象之前没有悬挂指针.
在编写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进行调用?
为任何愚蠢的问题道歉.任何帮助非常感谢.