我在实现自己的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会解除对所有绑定的绑定.这可确保在取消分配对象之前没有悬挂指针.
Cocoa for Mac OS X支持Cocoa Binding技术,减少了视图与模型之间粘合代码的需求.
在cocotron源代码的帮助下,在KVO上在KVC上重新创建Cocoa绑定似乎是可行的.
Cocoa Bindings不属于SDK的任何技术或概念上的原因吗?我正在考虑性能,缺乏垃圾收集,缺少UI元素的KVC支持(例如UISlider).
是否可以在Google Go中编写Mac OS X/Cocoa应用程序?
是否有Go-Obj-C桥?(在我看来,Obj-C的动态非常适合Golang的界面)
我至少可以将两者连接在一起,并通过普通的C函数让它们相互通信吗?
我试图在我的一个类中使用键值观察.我在init方法中注册观察者并在dealloc中删除/注销它们,但是我得到了以下错误,这似乎是在调用dealloc方法之前发生的,根据我的调试打印.
正在释放类TekkPoint的实例0x583870,而键值观察者仍在其中注册.观察信息被泄露,甚至可能被错误地附加到其他物体上.在NSKVODeallocateBreak上设置断点以在调试器中停止.这是当前的观察信息:(上下文:0x0,属性:0x536400>上下文:0x0,属性:0x55aba0>)
有什么特别的方法可以删除观察者吗?或者也许是我应该删除它们的特定地方?
根据这个问题,我正在做正确的事情,但为什么我会收到此错误消息?
这是我的dealloc例程:
- (void)dealloc {
// Remove all observers.
for (NSString *path in [TekkPoint observedPaths]) {
[self removeObserver:[option_ tChart]
forKeyPath:path];
}
[description_ release];
[weight_ release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
需要注意的一点是,我的实现可能很奇怪,我正在向观察者添加和删除观察者,这是否会导致我的问题?
objective-c key-value-observing cocoa-bindings observer-pattern
(自我询问和自我回答,因为我花了几个小时在网上寻找这个,大多数资源都说"我最终解决了它"而没有给出解释)
我有一个非常简单的Core Data + Bindings应用程序:
上面的第3项导致应用程序崩溃,错误如下:
[(my NSManagedObject) copyWithZone:]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)
实现该方法(!)并在那里放置一个断点,我发现它是由Apple的NSCell类调用的 - 这没有多大帮助:(.
我无法理解Cocoa绑定.有人可以用人类可感知的方式向我解释这是什么吗?
我正在探索绑定,并有一个NSPopUpButton -
它提出我的一些选项下的价值选择绑定- ,,Content s,然后,和.有人可以解释一下这些之间的区别吗?Content ObjectsContent ValueSelected ObjectSelected Value,Selected Tag
我想要完成的事情似乎应该相当简单.我在这里放了一个示例项目.
我有一个NSArrayController充满了NSDictionaries数组.
[[self controller] addObject:@{ @"name" : @"itemA", @"part" : @"partA" }];
[[self controller] addObject:@{ @"name" : @"itemB", @"part" : @"partB" }];
[[self controller] addObject:@{ @"name" : @"itemC", @"part" : @"partC" }];
Run Code Online (Sandbox Code Playgroud)
我正在使用'name'键来填充NSPopupButton以及此数组中的项目.使用以下绑定可以轻松完成此操作

然后,我想根据NSPopupButton的当前选择,使用'part'键中的文本填充NSTextField.我已经设置了以下绑定:

仅使用这些绑定,文本字段就会显示"partC".

但是,如果我更改NSPopupMenu的值,文本字段显示的内容不会更改.
我认为这只是在NSPopupButton上设置'Selected Object'绑定的问题

但那不起作用.我最终得到了菜单中的代理对象,原因有些奇怪(提供原因可能是奖金).

那么,我需要做些什么来使这项工作?
有没有人找到一个清晰,简洁的示例或指南,介绍如何使用Lion中引入的基于视图的NSOutlineView实现源列表?我看过Apple的示例项目,但没有任何方向或解释感,我发现很难掌握它们究竟是如何工作的概念.
我知道如何使用优秀的PXSourceList作为后备,但是如果可能的话,我真的想开始使用基于视图的源列表.
我越来越多地看到术语"绑定"和"活动绑定",特别是在像Ember.js,Can.js,Knockout.js和Backbone.js这样的JavaScript框架中,更传统的是,在Cocoa和Objective中-C,并想知道什么是绑定?(究竟什么是"活动绑定"?).
似乎从松散的意义上说,我们可以"绑定A到B",然后我们可以说,"A绑定到B",这意味着B中的更改将自动反映在A中 - 无需用户担心必须设置一个观察者,但观察者会自动设置,并在B更改时自动通知.
当我们这样做时,我们正在创造一种"约束力".
从更严格的意义上说,似乎Cocoa和Objective-C定义它是这样的:绑定是对象A 的属性 foo,并且此属性观察并更改为bar对象B 的属性值.如何发生,我们不要小心,它应该被隐藏(如黑盒子),通常它是由观察者模式实现的.所以"绑定"这个词实际上意味着一个"属性",而不是一个动作 - 这个属性观察并变为与其他属性相同的值.
此绑定不仅限于绑定到数据的UI元素.它可以是包含较小UI元素的外部较大UI元素,外部UI元素具有绑定到内部UI元素属性的属性.或者它可以是绑定到另一个非UI数据属性的一个非UI数据属性.
这到底是什么绑定吗?那么活动绑定呢?
cocoa-bindings ×10
cocoa ×7
objective-c ×3
macos ×2
backbone.js ×1
binding ×1
cocoa-touch ×1
core-data ×1
data-binding ×1
ember.js ×1
go ×1
ios ×1