如何在Cocoa中绑定NSDictionary子词典的值?

时间:2012-11-08 18:00:13

标签: cocoa nsdictionary cocoa-bindings

我有一个包含两个属性的类:NSString * fileName和NSDictionary *框架如下所示。

  • NSDictionary *框架
    • key:NSString
    • value:字段字典实例
  • NSDictionary *字段
    • key:NSNumber(C ++枚举值)
    • value:NSValue(C ++对象指针)

我想创建一个主详细视图,其中列出了每个文件的NSTableView。第一列中的fileName,它很容易绑定,但我无法弄清楚如何将任何列,或详细视图中的字段绑定到字段子字典中的值。

我想我无论如何都无法绑定到C ++对象方法。我想我需要一个自定义控制器来为字段子字典中的值。是否可以让自定义控制器遵循KVC,以便我可以通过枚举键访问字段值,调用适合于我正在使用的C ++库的枚举定义的类型的方法?

或者,我应该将每个字段的数据存储为字段字典中的值吗?在修改GUI中的值之后,我必须运行一个方法来处理字典,此时我可以重建C ++字段对象并调用适当的方法。

无论如何,我的挑战是找出嵌套字典的绑定。

2 个答案:

答案 0 :(得分:1)

对NSController和朋友进行子类化可能不是最好的方法。

没有办法解决这个问题:密钥/值编码,所有绑定所基于的API依赖于密钥/ keyPaths是NSStrings,而不是NSNumbers(或任何其他类型)。如果您从使用NSNumber密钥切换到使用NSString密钥,您可能会发现这更容易。到达那里可能就像使用switch字符实现两个函数一样简单,这些函数在字符串和枚举值之间来回转换。

您已经意识到没有希望绑定到C ++对象的指针,因此下面的讨论假设您已将值烘焙到字典中。如果由于某种原因,您无法在字段字典中切换到使用NSString键,则还可以继承NS [Mutable] Dictionary并覆盖-valueForUndefinedKey:-setValue:forUndefinedKey:来执行此转换。子类NS [Mutable] Dictionary不适合胆小的人,因为这些类是由类集群支持的。文档清楚地列举了子类的所有要求,因此我不在此处讨论。此外,在-setObject:forKey:实施中,您需要确保针对与使用NSNumber密钥进行的修改相对应的字符串键发送-willChangeValueForKey:-didChangeValueForKey:通知。

假设您最终希望将所有这些存储在std::hash_map<enum, ptr>或其他C ++类/结构中,那么桥接到Objective-C的逻辑方法是创建一个包含STL hash_map的新模型类,提供了使用NSString键的KVC / KVO语义,处理与上述类似的翻译。

答案 1 :(得分:0)

我最终将每个字段的数据存储为“fields”子字典中的值。我没有意识到我可以指定绑定到该值的键路径。

例如,我有一个带有成员NSArray“track”的类,其中包含一组对象,每个对象都有成员NSDictionary“frames”,如我的问题所述。 “tracks”在我的GUI中用一个NSArrayController表示,它绑定了一个NSTableView。

在NSTableView中,我可以使用模型键路径“objectValue.frames.key1.key2”将表格单元格的静态文本绑定到表格单元格视图。

同样,在master-detail视图的详细信息部分中,我可以将文本字段单元格绑定到NSArrayController,其中“selection”作为控制器键,“frames.key1.key2”作为模型键路径。