我被要求实现这样的组合框:
很明显,这与NSComboBox 完全相差<:> &LT 1为卤素;文本字段旁边的按钮应该是自定义的 &LT 2 - ;这一点非常重要:在每个组合项目中都有一个额外的“十字”(这是一个表示“删除”动作的按钮)。
我怎样才能达到这个效果?我搜索了互联网,但没有答案。任何人都可以告诉我应该做什么或者告诉我任何子类化或自定义NSComboBox类的例子吗?
答案 0 :(得分:4)
NSComboBox是一个视图,但由于我不会进入这里的原因,它的界面由附带的单元类绘制:NSComboBoxCell。对于自定义绘图,您通常必须子类化单元格类型(在本例中为NSComboBoxCell),在自定义单元格子类中实现所需的所有绘图,然后使视图使用-setCellClass:
或-setCell:
的单元格方法
但是,在这种情况下,NSComboBox继承自NSTextField,NSComboBoxCell继承自NSTextFieldCell,因此两者都已实现-setBackgroundColor:和-setTextColor:;因此绘制白色背景和蓝色文本应该相当容易。
我不确定NSComboBox如何绘制“下拉菜单”,我看不到任何定制方式,但我确信这是可能的。您可能需要在NSCell的绘图方法中进行游戏才能看到,
您将遇到的最后一个问题是将十字架放在文本字段中。您必须使用上面的NSCell绘图方法实现十字架的绘制。但是,要拦截鼠标点击,您需要使用NSView(因为NSCell不处理交互)。这意味着您还需要子类化NSComboBox并跟踪鼠标何时进入绘制十字的视图部分。
这一切都相当复杂,所以也许有另一种方式。你知道NSPopover吗?
使用NSPopover实现类似的功能要容易得多。 popover拥有一个视图,因此您不必使用NSCell方法。弹出窗口可以包含名称列表和NSButton(这是十字架)。