我被要求实现这样的组合框:
显然,这与NSComboBox完全不同:
应自定义文本字段旁边的按钮
这是非常重要的:每个组合项目中都有一个附加的“叉号”(这是一个指示“删除”动作的按钮)。
我怎样才能达到这种效果?我搜索了互联网,但没有找到答案。谁能告诉我该怎么做,或者告诉我任何继承或自定义NSComboBox类的示例?
最佳答案
NSComboBox是一个视图,但由于某种原因,我在这里不做介绍,它的界面是由一个随附的单元类绘制的:NSComboBoxCell。对于自定义图形,通常必须将单元格类型子类化(在本例中为NSComboBoxCell),在自定义单元格子类中实现所需的所有图形,然后使视图通过-setCellClass:
或-setCell:
方法使用单元格。
但是,在这种情况下,NSComboBox继承自NSTextField,而NSComboBoxCell继承自NSTextFieldCell,因此两者都已经实现了-setBackgroundColor:和-setTextColor:。因此绘制白色背景和蓝色文字应该相当容易。
我不确定NSComboBox是如何绘制“下拉菜单”的,我看不到任何自定义方式,但是我敢肯定有可能。您可能必须在NSCell的绘制方法中进行操作才能看到,
-drawInteriorWithFrame:inView:,
-drawWithFrame:inView:,
-drawWithExpansionFrame:inView:
您将遇到的最后一个问题是将叉号放在文本字段内。您将必须使用上述NSCell的绘制方法来实现十字架的绘制。但是,要拦截鼠标单击,您需要使用NSView进行此操作(因为NSCell不处理交互)。这意味着您还需要继承NSComboBox的子类,并跟踪鼠标何时进入绘制十字的视图部分。
这都是相当复杂的,所以也许还有另一种方法。您知道NSPopover吗?
使用NSPopover实施类似的操作会容易得多。弹出窗口拥有一个视图,因此您无需弄乱NSCell方法。弹出窗口可能包含名称列表和一个NSButton(即叉号)。