Cocoa:NSArrayController的自定义控制器密钥

Cocoa:NSArrayController的自定义控制器密钥,cocoa,interface-builder,cocoa-bindings,nsarraycontroller,Cocoa,Interface Builder,Cocoa Bindings,Nsarraycontroller,是否可以为NSArrayController创建自定义控制器密钥?有“排列对象”、“选择”等键。。。有可能实现你自己的吗?我似乎在任何地方都找不到这方面的任何信息 我想这样做的原因(除此之外,这似乎是一件有用的事情)是: 我有实体“Car”,具有属性“color”和“miliety”,还有一个数组控制器“CarArrayController”,它保存这些对象并在表中显示它们。下表我想要两个文本字段,一个显示红色汽车总里程,另一个显示蓝色汽车总里程。显然,我可以显示所有汽车的总数:将值绑定到“Ca

是否可以为NSArrayController创建自定义控制器密钥?有“排列对象”、“选择”等键。。。有可能实现你自己的吗?我似乎在任何地方都找不到这方面的任何信息

我想这样做的原因(除此之外,这似乎是一件有用的事情)是:

我有实体“Car”,具有属性“color”和“miliety”,还有一个数组控制器“CarArrayController”,它保存这些对象并在表中显示它们。下表我想要两个文本字段,一个显示红色汽车总里程,另一个显示蓝色汽车总里程。显然,我可以显示所有汽车的总数:将值绑定到“CarArrangedController.arrangedObjects.@sum.Miledge”,但到目前为止,如果不实现更多阵列或阵列控制器,我无法获得红色和蓝色汽车的单独总和

如果我可以创建一个控制器键“arrangedRecaroObjects”,它显然只返回红色汽车,那么我就可以绑定到:“CarArrangedController.arrangedCaroObjects.@sum.milies”

我似乎找不到任何方法来实现我的目标:(

一定有办法得到我需要的结果(这似乎是一个一般性的问题),请帮助

干杯


奥利

如果您有办法询问汽车是红色还是蓝色,您可以创建两个由主控制器馈电的辅助阵列控制器(将辅助控制器的内容阵列绑定到主控制器的
排列对象
)每个控制器都有一个过滤器谓词,该谓词将数组限制为正确的汽车颜色。

控制器键不仅仅是字符串:它们是NSArrayController的方法,每个方法都经过一些逻辑,创建一个对象,然后返回该对象。不能只添加键,因为键后面没有任何逻辑

因此,如果你不想制造更多的阵列控制器,你需要制造一个功能更强大的阵列控制器。制造一个NSArrayController的子类,为你想要的键实现方法,在这些方法中,问自己源阵列(例如,
arrangedObjects
),执行所需的任何限制和重新排列,并返回该结果


不要忘记声明新方法依赖于它们的源属性(例如,
arrangedCaroObjects
依赖于
arrangedObjects
)。这是仅向列表中添加键无法完成的另一件事:它不知道新键应该依赖于哪个源属性。

我已经尝试过了,而且它可以工作。但我想找到一种解决问题的方法,而不必创建新数组(控制器)对于每种颜色的汽车。必须有一种方法来添加自定义控制器键?!当然???这对我的问题有很大的启发,谢谢!我可以将NSArrayController子类化,以提供其他方法,这些方法返回数组的过滤部分(我也可以使用类别将方法添加到NSArrayController类中).那么,我该如何绑定到这些方法呢?例如,我可以将文本框链接到“blueCarFilteringMethod.@sum.milegae”?Charlie:是的。正如我所说,控制器键是方法。如果添加一个方法并使其可见(例如,通过使其依赖于现有键),您添加了一个键,并以与一个常用键相同的方式绑定到它。(不要将其包含在模型键路径中。)啊,好吧,所以可能我没有让我的新方法可见。我一直试图以与使用常用键相同的方式绑定到它们,即“arrangeBlueCarObjects”而不是“arrangeObjects”但是应用程序将无法运行。我将尝试让它们可见(如何?)并返回给你。谢谢你的帮助查理:我在回答和我的评论中都告诉了你如何运行。你说“应用程序将无法运行”是什么意思?我有一个NSArrayController的子类,它的方法只提供蓝色汽车。但我认为它目前不可观察。当我点击“构建并运行”时,我得到错误:“[addObserver:forKeyPath:options:context:]不受支持。键路径:@sum.Milege”。如何使我的方法依赖于现有键(例如arrangedObjects)(我想你是这个意思吧?)?