0

我有一个具有两个属性的类:NSString *fileName 和 NSDictionary *frames,如下所示。

  • NSDictionary *帧
    • 键:NSString
    • 值:字段字典的实例
  • NSDictionary *字段
    • 键:NSNumber(C++ 枚举值)
    • 值:NSValue(C++ 对象指针)

我想创建一个包含每个文件的 NSTableView 的主从视图。第一列中的文件名,这很容易绑定,但我不知道如何将任何列或详细视图中的字段绑定到字段子字典中的值。

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

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

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

4

2 回答 2

1

继承 NSController 和朋友可能不是最好的方法。

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

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

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

于 2012-12-05T03:57:56.450 回答
0

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

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

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

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

于 2012-12-09T00:31:09.690 回答