Cocoa绑定:将固定项与NSPopupButton中的ArrayController绑定项组合在一起

时间:2009-08-08 05:19:54

标签: objective-c cocoa interface-builder cocoa-bindings

我正在尝试使用NSPopupButton制作颜色选择器,而在底部我想要一个分隔符和一个“自定义...”选项。是否可以从数组加载颜色,然后粘贴分隔符和底部的“自定义”项?如果是这样,怎么样?

谢谢!

5 个答案:

答案 0 :(得分:1)

我创建了一个类似的PopUpButton,但尚未将默认颜色绑定到固定数组(尽管我现在正在研究它)。这里有两个appraoches - 两者都可能被纯粹主义者视为黑客攻击,但他们确实完成了工作。

  1. 对NSPopUpButtonCell进行子类化并覆盖attachPopUpWithFrame以添加自己的菜单项。我没有尝试过绑定项目。

  2. 对数组中的“Custom ..”对象进行硬编码,并使用显示的颜色面板的操作,向数组添加新项目。

答案 1 :(得分:0)

不使用Bindings,没有。你可以很容易地做“自定义...”,但不能做分隔符。

为什么不使用NSColorWell?

答案 2 :(得分:0)

你应该使用NSColorWell而不是手工制作自己的。 Apple拥有优于其他平台(尤其是Linux)的GUI的原因之一是因为开发人员使用标准组件来执行此类操作。像'因为我认为它使界面更简洁'这样的论点是GIMP如何不设计GUI的一个主要例子的原因。

那就是说,基本上你要做的就是定义一个动态菜单,而不是一个固定大小的列表(就像在InterfaceBuilder中那样)。您可以通过NSMenu和NSMenuItem类来完成此操作。

MenuList documentation guide

您需要做的不是按需显示菜单,而是在应用程序使用默认数组启动时填充它。然后,当阵列更改时(通过模型对象)触发重新创建菜单。或者,使用menuNeedsUpdate:message来捕获菜单。

答案 3 :(得分:0)

使用“内容放置”标签,从Mac OS X 10.5开始绑定即可实现;看到我的回答:

Separator item in NSPopupButton with bindings

答案 4 :(得分:0)

  1. 照常在NSPopupButton上配置绑定
  2. NSPopupButton的绑定配置中,将Content Placement Tag的值设置为1

Content Placement Tag for the dynamic content

  1. 在情节提要中,展开NSPopupButton并选择与NSPopupButton关联的NSMenu
  2. 确保菜单中有两项:

    • 将“代表”动态内容的第一项。将标签值设置为1->这对于将绑定动态内容插入正确的位置非常重要。 Menu Item to receive the right tag
    • 第二项将成为您的“自定义...”菜单项

可选:在动态和静态内容之间添加分隔符菜单项:

  1. ViewController设置为NSMenu的委托
  2. 将您的ViewController设为NSMenuDelegate,然后在您的ViewController中添加以下代码:

    extension YourViewController: NSMenuDelegate {
    
        func menuNeedsUpdate(_ menu: NSMenu) {
    
        menu.insertItem(NSMenuItem.separator(), at: menu.numberOfItems-1)
        }
    }
    

这将简单地在动态内容和静态“自定义...”菜单项之间正确插入分隔符