【问题标题】:Cocoa binding NSTableView within NSTableView可可在 NSTableView 中绑定 NSTableView
【发布时间】:2014-06-27 19:30:13
【问题描述】:

我正在尝试在 NSTableView 中显示 NSTableView。这是用于类似 iTunes 的专辑/曲目视图。所以有一个10张专辑的列表,每张专辑都有一些曲目。我想在外部表视图中显示专辑,在内部表视图中显示每个专辑的曲目。

第一个 NSTableView 绑定到一个 NSArrayController。数组中的每个对象都有自己的“tracks”NSArrayController,但我不知道如何告诉“tracks”NSTableView 它的内容来自“album”NSTableView 的属性。

【问题讨论】:

  • 在摆弄您的项目后删除了我的答案。我看不到如何让objectValue 绑定与嵌入在单元格中的数组控制器一起工作——Nibs/XCode 似乎只是认为 objectValue 是专辑,而不是嵌套的轨道单元格。很明显,我也不能在 IB 的单元格视图中嵌套 AC 对象。我唯一的想法是让整个专辑单元格成为一个自定义视图 Nib,并在那里有一个阵列控制器插座来连接。在新的 Nib 中,XCode 将能够找到数组控制器对象。

标签: macos cocoa nstableview cocoa-bindings


【解决方案1】:

如果我没听错的话,嵌套数组控制器的源内容来自所有者表格单元格的 objectValue。所以不能把数组控制器内容源作为表格单元格的objectValue。我正在做类似的事情,因为我想根据对象值过滤数组内容

我正在做的,似乎正在工作,是为您的嵌套表格单元格视图制作一个单独的 nib 文件,它有自己的 nstablecellview 子类。在 nib 中包含数组控制器,并在单元格视图子类中为其创建一个出口。

在表格视图控制器的 viewDidLoad 方法中向表格视图注册:

NSNib *cellView = [[NSNib alloc] initWithNibNamed:@"MyTableCellView" bundle:nil];
[myTableView registerNib:cellView forIdentifier:@"myTableCellView"];

然后,在单元格视图子类的 awakeFromNib 方法中,手动进行需要对象值的绑定:

[self.arrayController bind:@"contentSet"
                  toObject:self
               withKeyPath:@"objectValue.tracks"
                   options:nil];

瞧。

请注意,当使用此技术时,nib 文件的 files Owner 不是您的 nstablecellview 子类,它是 table view 的视图控制器。

【讨论】:

    【解决方案2】:

    问题在于不了解 MVC 模式(Model-View-Controller)。视图的内容永远不会来自另一个视图,它通过控制器来自模型对象。每个表视图的内容总是来自一个 NSObjectController,或者像 NSArrayController 这样的子类。基本上有两种解决方案:

    • 将“tracks”表视图绑定到“album”数组控制器的选择
    • 创建一个“tracks”阵列控制器并将其绑定到“album”阵列控制器的选择。将 'tracks' 表视图绑定到 'tracks' 数组控制器

    第三种解决方案是将 NSTreeController 与 NSOutlineView 一起使用,但众所周知,大纲视图和树控制器很难使用。

    【讨论】:

    • 这不太正确。它是standard practice 与使用NSTableCellView 作为单元格视图的基于视图的表,子视图绑定到NSTableCellView 的objectValue 属性。实际上,NSTableCellView 是单元格的对象控制器。
    • 我非常了解 MVC。你错过了我说模型本质上是一个数组数组的部分。外部 tableview 绑定到顶级数组。棘手的部分是将内部 tableview 绑定到子数组。我最终做了@stevesliva 推荐的几乎所有事情,并且奏效了。它分布在比我想要的更多的文件中,但它完成了工作。
    • @jsd 你有一个样本说明你最终是如何做到的吗?
    • @tofutim 没有可共享的形状。如果不编写代码,您将无法真正做到。外部 tableview 类可以将内部数据传播到内部 tableview 类。没有办法直接绑定。
    • @KenThomases 请滚动到您链接到的页面顶部的注释,上面写着:“在基于 NSView 的表格中,您将表格视图的内容绑定到数组控制器的排列对象。这与您使用基于 NSCell 的表时使用的技术不同。”您所指的“标准”仅适用于基于视图的表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多