我正在以编程方式更改可可绑定。我将NSTextField的值绑定到ArrayController的选择。手动更改绑定后,我得到“不符合键值的键值编码”错误,键是旧键,而不是新键。
查看代码:
NSTextField *textField = [self listTextField];
NSDictionary *currentBindInfo = [textFieldTableViewCell infoForBinding:NSValueBinding];
NSLog(@"pre-change bindings for textField: %@", currentBindInfo);
/* Change the binding. [Tried unbind: first, no difference] */
[textField bind:NSValueBinding
toObject:[currentBindInfo valueForKey:NSObservedObjectKey]
withKeyPath:@"objectValue.iLifeProductName"
options:[currentBindInfo valueForKey:NSOptionsKey]];
/* Log the info so we can confirm it changed. debugging. */
NSLog(@"post-change bindings for textField: %@", [textFieldTableViewCell infoForBinding:NSValueBinding]);
要进行故障排除,我在更改之前和之后调用'infoForBinding',它看起来要正确更改。我可以看到旧值,然后我调用bind:toObject ...并再次转储infoForBinding,并且绑定的值已更改:
2011-07-06 22:36:23.137 My App 2011[14640:407] pre-change bindings for listTextFieldTableViewCell: {
NSObservedKeyPath = "selection.osxProductName";
NSObservedObject = "...sameTextField... 0x4009cc380>";
NSOptions = {...same... };
}
2011-07-06 22:36:23.138 My App 2011[14640:407] post-change bindings for listTextFieldTableViewCell: {
NSObservedKeyPath = "selection.iLifeProductName";
NSObservedObject = "...sameTextField... 0x4009cc380>";
NSOptions = {...same... };
}
但代码仍在调用原始密钥:
2011-07-06 22:36:23.231 My App 2011 [14640:407] [valueForUndefinedKey:]:实体ILifeVersion不是密钥值编码兼容的密钥“osxProductName”。
-
NSArrayController绑定到ManagedObjectContext,实体名称先前已更改为:
[[self listAC] setEntityName:entityName];
原始keyValuePath是否被缓存到我需要清除的地方?是否有像willChange / didChangeValueForKeyValuePath这样的消息,当我更改观察到的密钥路径时,我需要将其发送到绑定或arrayController?
想法?
谢谢!
答案 0 :(得分:0)
正如@noa指出的那样,您正在查看单元格上的绑定,但更改其控件上的绑定。这是导致问题的结果( ahem )。
替换它:
[textField bind:NSValueBinding
toObject:[currentBindInfo valueForKey:NSObservedObjectKey]
withKeyPath:@"objectValue.iLifeProductName"
options:[currentBindInfo valueForKey:NSOptionsKey]];
用这个:
[textFieldTableViewCell bind:NSValueBinding
toObject:[currentBindInfo valueForKey:NSObservedObjectKey]
withKeyPath:@"objectValue.iLifeProductName"
options:[currentBindInfo valueForKey:NSOptionsKey]];
看看它是否更好。
对此的解释有点神秘,而且我是从记忆中做到的,所以如果我弄错了一些细节,请原谅。
因为NSControls和它们的NSCell一起工作得很紧密,所以在大多数情况下你实际上可以绑定到控件或单元格,你会得到非常相似的结果。也就是说,如果控件被绑定,控件中的代码将在其NSCell上调用正确的方法,反之亦然。
这意味着如果在XIB中,你绑定到一个或另一个东西将起作用,这是好的。它还意味着在每个视图中有多个单元格的情况下,您可以绑定到单元格,这样做很好。但是,它可能导致混淆,因为实际上你实际上可以绑定到你的视图和它的单元格,并且事实上它们以不同的方式绑定它们,然后它们会相互串扰。
就最佳实践而言,我尝试仅绑定到NSControls,除非我有充分的理由下载到NSCells。部分是因为它与我在XIB中所做的相匹配,部分是因为任何标准都有助于减少这个问题,部分原因是因为NSCells正在被轻易弃用。