基于视图的 NSTableView 中的 NSPopupButton

Posted

技术标签:

【中文标题】基于视图的 NSTableView 中的 NSPopupButton【英文标题】:NSPopupButton within a view-based NSTableView 【发布时间】:2012-12-22 13:58:31 【问题描述】:

我正在使用核心数据和最新的 XCode。我有一个基于视图的表,其中一个列中有NSPopupButtons。该表有一个数组控制器,它从实体 A 获取数据。实体 B 有另一个数组控制器。正是这个实体 B 应该填充弹出按钮项。

一个表外的NSPopupButton可以填写没有问题,所以这一定是表相关的问题!

我应该如何填充表格列中的弹出按钮?

【问题讨论】:

你研究过 NSTableViewCell 的子类化吗? 不,我没有。这可能会奏效,但这真的是我应该继续的方式吗?单元格中的弹出窗口似乎是使用基于视图的表格的主要原因,所以我更愿意尽可能远离子类化:-) 另一种可能性是使用 NSPopUpButtonCell。但是,这可能不是您所希望的那样。 NSTableCellView 文档声明“NSTableCellView 类是一个可重用的容器视图,显示用于 NSTableView 实例中的特定单元格,它使用行作为内容。imageView 和 textField 属性在 Interface Builder 中连接。其他属性可以通过继承 NSTableCellView 并添加所需的属性并以编程方式或在 Interface Builder 中连接它们来添加。" 啊,没错。真可惜,我希望有一个快速的绑定解决方案。 【参考方案1】:

您可以执行以下操作:

    将表格视图的行高增加到 22 像素或更大。 绑定到objectValue.menuValues(显然是您添加到objectValue 的内容)。 NSPopupButton 应作为NSTableCellView 的子视图放置。

这样,只要您的objectValue 具有能够填充NSPopupButton 菜单的绑定,您就不需要直接访问它。从这里您还可以将selector 出口设置为您的委托/视图控制器的类,并使用一些漂亮的superview 挖掘来找到持有它的NSTableCellView,然后从那里进行操作。

我知道这很复杂,但它几乎是零代码。曾几何时,我曾经看不起IB太“n00b”,但Bindings让它成为了一个相当强大的工具。

【讨论】:

感谢您的建议!我一有机会就会看看这个,希望在星期一。 没问题,我很想看看这对你有什么影响。 抱歉,在对 UI 进行大修后,我的项目中不再存在此问题,不幸的是,我无法轻松查看您的建议。我确实认为我以后会遇到这个问题,我一定会报告我的结果!【参考方案2】:

我当然找到了基于单元的 NSPopupButtonCell 工作。您应该能够使用基于视图的表来实现相同的目标。当您直接绑定到视图中的对象时,绑定完全不同。因此,将弹出窗口的内容直接绑定到数据源。在 IB 中为实体 B 创建一个 ArrayController 并将其直接绑定到 Popups Content,还将 contentValue 绑定到要显示的实体 B 的字段。

然后将弹出窗口的列内容绑定到实体 A,现在将弹出窗口的值绑定到表格单元格视图对象值。(实体 A 字段名称)。

【讨论】:

【参考方案3】:

需要通过 Files' Owner 传递控制器,而不是直接绑定到弹出按钮。 (有人说,这是 Xcode 中的一个 bug..)

所以,我的解决方案在文件所有者中使用了一个 IBOutlet (currencyCtrl),它绑定到数组控制器(在您的情况下是实体 B)。 对于 NSPopupButton,您应该使用以下绑定:

【讨论】:

以上是关于基于视图的 NSTableView 中的 NSPopupButton的主要内容,如果未能解决你的问题,请参考以下文章

正确调整基于视图的 NSTableView 上的行大小

OSX 基于视图的 NSTableView 字体更改

基于视图的 NSTableView 的目标操作数据源更新

tableCellView 内的 NSButton:如何对基于视图的 NSTableView/NSArrayController 使用“动作调用”

根据表中的行数调整 NSTableView 或 NSScrollView 的大小

为 NSTableView 单元格绘制带有边框和背景的文本