Cocoa 绑定:将固定项目与 NSPopupButton 中的 ArrayController 绑定项目组合起来

发布于 2024-07-30 07:05:36 字数 125 浏览 14 评论 0原文

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

谢谢!

I'm trying to make a color chooser using an NSPopupButton, and at the bottom i'd like a separator and a "Custom…" option. Is it possible to load the colors from array, then tack the separator and "custom" item on bottom? if so, how?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

迷离° 2024-08-06 07:05:36
  1. 照常配置 NSPopupButton 上的绑定
  2. NSPopupButton 的绑定配置中,将 Content Placement Tag 值设置为 1代码>

动态内容的内容放置标记

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

    • 第一个项目将“代表”动态内容。 将标签值设置为1 --> 这对于将绑定动态内容插入到正确的位置非常重要。 菜单项接收正确的标签
    • 第二个项目将是您的“自定义...”菜单项

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

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

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

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

  1. Configure your bindings on the NSPopupButton as usual
  2. In your bindings configuration for the NSPopupButton, set the Content Placement Tag value to 1

Content Placement Tag for the dynamic content

  1. In the Storyboard, expand the NSPopupButton & select the NSMenu associated with the NSPopupButton
  2. Make sure you have two items in your menu:

    • First item that will "represent" the dynamic content. Set the tag value to 1 --> this is important for the bindings dynamic content to be inserted at the right place. Menu Item to receive the right tag
    • Second item will be your "Custom..." menu item

Optional: Add a Separator Menu Item between dynamic and static content:

  1. Set your ViewController as delegate for the NSMenu
  2. Make your your ViewController a NSMenuDelegate and add the following code in your ViewController:

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

which will simply properly insert a separator between your dynamic content and your static "Custom..." menu item

萌吟 2024-08-06 07:05:36

不使用绑定,不。 您可以很容易地执行“自定义...”,但不能使用分隔符。

无论如何,为什么不使用 NSColorWell 呢?

Not using Bindings, no. You could do the “Custom…” one easily enough, but not the separator.

Why not use an NSColorWell, anyway?

我爱人 2024-08-06 07:05:36

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

  1. 子类化 NSPopUpButtonCell 并覆盖 AttachPopUpWithFrame 以添加您自己的菜单项。 我还没有尝试过将其与绑定物品一起使用。

  2. 对数组中的“自定义..”对象进行硬编码,并执行显示的颜色面板的操作,将新项目添加到数组中。

    对数组

I have created a similar PopUpButton, but am not yet binding the default colors to a fixed array (though I am working on that now). there are two appraoches here - both may be considered hacks by purists, but they do get the job done.

  1. Subclass the NSPopUpButtonCell and override attachPopUpWithFrame to add your own menu items. I have not tried this alongside bound items.

  2. Hard-code the 'Custom ..' object in your array, and have the action of the displayed color panel, add a new item to the array.

抠脚大汉 2024-08-06 07:05:36

你真的应该使用 NSColorWell而不是自己手工制作。 Apple 拥有比其他平台(尤其是 Linux)更优秀的 GUI 的原因之一是因为开发人员使用标准组件来完成此类操作。 像“因为我认为它使界面更加简洁”这样的论点是 GIMP 成为不设计 GUI 的最佳示例的原因。

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

MenuList 文档指南

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

You should really use a NSColorWell instead of hand-crafting your own. One of the reasons why Apple has superior GUIs than other platforms (especially Linux) is because developers use the standard components for doing this kind of thing. Arguments like 'because I think it makes the interface more concise' are the reasons why GIMP is such a prime example of how not to design a GUI.

That said, basically what you're trying to do is define a dynamic menu, rather than a fixed-size list (as one might do in InterfaceBuilder). You can do this via the NSMenu and NSMenuItem classes.

MenuList documentation guide

What you'd need to do, is rather than display the menu on-demand, is fill it when the application starts up with the default array. Then, when the array changes (via your model objects) trigger the re-creation of the menu. Alternatively, trap the menu with the menuNeedsUpdate: message.

吐个泡泡 2024-08-06 07:05:36

从 Mac OS X 10.5 开始,可以使用“内容放置”标签进行绑定; 请在此处查看我的答案:

带有绑定的 NSPopupButton 中的分隔符项目

This is possible with bindings as of Mac OS X 10.5 using the "content placement" tag; see my answer here:

Separator item in NSPopupButton with bindings

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文