4

我被要求实现这样的组合框:

在此处输入图像描述

很明显,这和 NSComboBox 有很大的不同
<1> 文本框旁边的按钮应该是自定义的
<2> 这更重要的是:还有一个额外的“十字”(这是一个表示“删除”动作的按钮) 在每个组合项目中。

我怎样才能达到这个效果?我搜索了互联网,但没有找到答案。谁能告诉我我应该做什么或告诉我任何子类化或自定义 NSComboBox 类的示例?

4

1 回答 1

4

NSComboBox 是一个视图,但由于我不会在这里介绍的原因,它的界面是由一个随附的单元格类绘制的:NSComboBoxCell。对于自定义绘图,您通常必须子类化单元格类型(在本例中为 NSComboBoxCell),在自定义单元格子类中实现您想要的所有绘图,然后通过-setCellClass:or-setCell:方法使视图使用您的单元格。

但是,在这种情况下,NSComboBox 继承自 NSTextField,而 NSComboBoxCell 继承自NSTextFieldCell,因此两者都已经实现了 -setBackgroundColor:-setTextColor:;所以绘制白色背景和蓝色文本应该相当容易。

我不确定 NSComboBox 如何绘制“下拉菜单”,我看不到任何自定义方式,但我确信这是可能的。您可能必须在 NSCell 的绘图方法中玩耍才能看到,

您将遇到的最后一个问题是将十字放在文本字段内。您必须使用上面 NSCell 的绘图方法来实现十字的绘制。但是,要拦截鼠标点击,您需要使用 NSView 执行此操作(因为 NSCell 不处理交互)。这意味着您还需要继承 NSComboBox 并跟踪鼠标何时进入绘制十字的视图部分。

这一切都相当复杂,所以也许还有另一种方法。你知道 NSPopover 吗?

NSP弹出框

用 NSPopover 实现类似的东西会容易得多。弹出框包含一个视图,因此您不必弄乱 NSCell 方法。弹出框可以包含名称列表和一个 NSButton(它是叉号)。

于 2014-01-26T12:48:44.800 回答