【问题标题】:Cocoa: Custom Controller Key for NSArrayControllerCocoa:NSArrayController 的自定义控制器键
【发布时间】:2011-04-12 14:37:27
【问题描述】:

是否可以为 NSArrayController 创建自定义控制器键?有“arrangedObjects”,“selection”等键......是否可以实现自己的?我似乎在任何地方都找不到这方面的任何信息。

我想要这样做的原因(除了这样做看起来很有用)是:

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

如果我可以创建一个显然只返回红色汽车的控制器键“arrangedRedCarObjects”,我可以绑定到:“CarArrangedController.arrangedRedCarObjects.@sum.mileage”。

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

一定有办法得到我需要的结果(这似乎是一个普遍的问题),请帮忙!

干杯,

奥利

【问题讨论】:

    标签: cocoa interface-builder cocoa-bindings nsarraycontroller


    【解决方案1】:

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

    【讨论】:

    • 我已经尝试过了,它可以工作。但我想要一种解决问题的方法,而不必为每种颜色的汽车创建一个新的数组(控制器)。一定有办法添加自定义控制器键?!当然???
    【解决方案2】:

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

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

    不要忘记将新方法声明为依赖于它们的源属性(例如,arrangedRedCarObjects 依赖于 arrangedObjects)。这是仅将键添加到列表中无法完成的另一件事:它不知道您的新键应该依赖什么源属性/-ies。

    【讨论】:

    • 这对启发我了解我的问题大有帮助,谢谢!我可以将 NSArrayController 子类化以提供额外的方法来返回数组的过滤部分(我也可以使用分类来向 NSArrayController 类添加方法)。但是,我如何绑定到这些方法?即我可以以某种方式将文本框链接到“blueCarFilteringMethod.@sum.milegae”吗??
    • 查理:是的。正如我所说,控制器键是方法。如果您添加一个方法并使其可观察(例如,通过使其依赖于现有密钥),您已经添加了一个密钥,并且您以与其中一个股票密钥相同的方式绑定到它。 (不要将它包含在模型密钥路径中。)
    • 啊,好吧,所以也许我没有让我的新方法可观察。我一直在尝试以与使用库存键相同的方式绑定它们,即“arrangeBlueCarObjects”而不是“arrangeObjects”,但应用程序将无法运行。我会尝试让它们可观察(如何?)并回复你。感谢您的帮助
    • 查理:我在答案和评论中都告诉过你。 “应用程序将无法运行”是什么意思?
    • 我有一个 NSArrayController 的子类,它的方法只提供蓝色汽车。我不认为它目前是可观察的。当我点击“Build and Go”时,我收到错误消息:“[ addObserver:forKeyPath:options:context:] 不受支持。关键路径:@sum.mileage”。如何让我的方法依赖于现有的键(例如,arrangedObjects(我想这就是你的意思?))?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多