Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何绑定到Cocoa中NSDictionary子字典的值?_Cocoa_Nsdictionary_Cocoa Bindings - Fatal编程技术网

如何绑定到Cocoa中NSDictionary子字典的值?

如何绑定到Cocoa中NSDictionary子字典的值?,cocoa,nsdictionary,cocoa-bindings,Cocoa,Nsdictionary,Cocoa Bindings,我有一个具有两个属性的类:NSString*文件名和NSDictionary*框架,如下所示 NSDictionary*帧 关键字:NSString 值:字段字典的实例 NSDictionary*字段 键:NSNumber(C++枚举值) 值:NSValue(C++对象指针) 我想创建一个主详细视图,其中NSTableView列出每个文件。第一列中的fileName,很容易绑定,但我不知道如何将任何列或详细视图中的字段绑定到字段子字典中的值 我想我无论如何也不能绑定到C++对象方法。

我有一个具有两个属性的类:NSString*文件名和NSDictionary*框架,如下所示

  • NSDictionary*帧
    • 关键字:NSString
    • 值:字段字典的实例
  • NSDictionary*字段
    • 键:NSNumber(C++枚举值)
    • 值:NSValue(C++对象指针)
我想创建一个主详细视图,其中NSTableView列出每个文件。第一列中的fileName,很容易绑定,但我不知道如何将任何列或详细视图中的字段绑定到字段子字典中的值

<>我想我无论如何也不能绑定到C++对象方法。我想我需要一个自定义控制器来控制字段子字典中的值。是否有可能使自定义控制器坚持KVC,这样我就可以通过EnUM键访问字段值,调用适合于由我使用的C++库定义的类型的方法? 或者,我应该将每个字段的数据作为值存储在字段字典中吗?在修改GUI中的值之后,我将不得不运行一种方法来处理字典,在这一点上,我可以重构C++字段对象并调用适当的方法。
无论如何,我的挑战是找出嵌套字典的绑定。

子类化NSController和friends可能不是最好的方法

没有办法解决这个问题:键/值编码,所有绑定所基于的API依赖的键/键路径是NSString,而不是NSNumber(或任何其他类型)。如果您从使用NSNumber键切换到使用NSString键,您可能会发现这要容易得多。实现这一点非常简单,只需使用switch语句实现两个函数,在字符串和枚举值之间来回转换

你已经意识到,绑定一个C++对象的指针是没有希望的,所以下面的讨论假设你已经将值烘焙到字典中。如果出于某种原因,您无法在字段字典中切换到使用NSString键,您还可以将NS[Mutable]字典子类化,并覆盖

-valueforundinedkey:
-setValue:forundinedkey:
以执行此转换。子类化NS[Mutable]字典不适合胆小的人,因为这些类由类集群支持。文档清楚地列举了子类的所有需求,所以我在这里不做介绍。此外,您需要在
-setObject:forKey:
实现中,确保发送
-willChangeValueForKey:
-didChangeValueForKey:
与使用NSNumber键进行的修改相对应的字符串键通知


假设您最终希望将所有这些存储在 STD::HasyMava或其他C++类/Stutt中,桥接Objto-C的逻辑方法是创建一个新的模型类,它封装了STL哈什映射,并使用NSKEY键提供了KVC/KVO语义,处理翻译的方法与上面描述的类似。

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

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

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


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

在发布问题后,我算出了NSString与NSNumber的区别。最后,我按照我的最后一个建议——将每个字段的数据作为值存储在子字典中。我认为现在只需要弄清楚要使用哪些控制器对象,如何将它们链接到视图,以及如何使用正确的键配置视图,等等。