【问题标题】:Tiered NSPopupButton binding分层 NSPopupButton 绑定
【发布时间】:2016-06-21 04:22:25
【问题描述】:

我正在尝试让两个 NSPopupButton 相互链接,但在“子”按钮上的绑定存在问题。

我有三种核心数据实体类型:OrderClientStationStation -> Client 是多对一,所以Client 有多个Station,但Station 只能指向一个客户端。

Order 附加了一个 Station,因此我创建了如下所示的所有绑定。我可以从第一个下拉列表中正确选择任何客户端,但是站点下拉列表仅显示当前选择的站点。我没有看到所有可用的电台,如果我更改客户端,我也看不到可供选择的新电台列表。

订单控制器

一个 NSObjectController 绑定到视图控制器中的 order 实体属性。

客户端数组控制器

只需绑定到视图控制器的 managedObjectContext 即可获取所有客户端。

站阵列控制器

客户端 NSPopupButton

站 NSPopupButton

【问题讨论】:

  • 订单和客户是什么关系?
  • 订单控制器的内容是订单还是客户端?
  • 对不起,订单控制器有订单。客户是一个错字。订单是针对特定站点的,并且该站点属于客户。把它想象成广播电台。您有多个站点都归母公司(客户)所有
  • 订单是否有客户端属性?
  • 没有。 Order 有一个 station 属性,它又具有一个 client 属性。因为一个站属于一个客户端,它也不必存储客户端。但是,当人工通过 UI 进行编辑时,他们必须首先选择一个客户端,因为站名可能不是唯一的,即使它们具有唯一的标识符。

标签: cocoa cocoa-bindings nspopupbutton


【解决方案1】:

客户端弹出按钮的选定值用于过滤站点,它不应更改订单站点的客户端。将客户端弹出按钮的选定索引(而不是选定对象)绑定到客户端阵列控制器,控制器键selectionIndex,没有模型键路径。

将站弹出按钮的选定对象绑定到订单对象控制器,控制器键selection,模型键路径station

当用户选择一个客户端时,选择的站点仍然是订单的站点。如果该站有不同的客户端,站弹出按钮不会自动选择另一个站。您可以在客户端弹出按钮的操作中解决此问题。例如:

- (IBAction)clientAction:(id)sender {
    NSArray *stations = self.stationArrayController.arrangedObjects;
    if (![stations containsObject:order.station]) {
        if (stations.count > 0)
            self.order.station = stations[0];
        else
            self.order.station = nil;
    }
}

【讨论】:

  • 一旦我选择了一个客户端,就会调用 clientAction,此时 stationArrayController 显然还没有填充新值。
  • 很奇怪,在我的测试应用中,弹出按钮首先更新绑定,然后调用操作方法。
  • 我还在为此苦苦挣扎。我更新了问题以显示我当前的绑定。当我现在运行时,我得到一个关于 NSCFNumber 计数无法识别的异常。看起来它现在只是无法进行初始绑定。
  • 移除 Stations Array 控制器的 Selected Indexes 绑定。你不需要它,它正在将一个集合绑定到一个数字。
  • 谢谢!根据我为站数组获取的错误,我还将其更改为 ContentSet 。我唯一要解决的问题是编辑现有订单时的初始值。我可以在viewDidLoad 中调用clientDropDown.selectItemWithTitle(order.stations.client.name) 并且设置正确,但是站阵列控制器不会“触发”进行更新,所以我的站列表在那时仍然是错误的。
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多