【问题标题】:How can I keep an NSPopUpButton open after the user selects a menu item?用户选择菜单项后,如何保持 NSPopUpButton 打开?
【发布时间】:2009-06-13 15:15:45
【问题描述】:

我有一个 NSPopUpButton 为带有自定义视图的状态项提供 NSMenu。弹出按钮显示链接列表。当用户从列表中选择一个链接时,该链接会显示在用户的浏览器中(在后台)。

自然,每次用户选择链接时菜单都会关闭。

我想改变这一点:我希望菜单在用户点击各种链接时保持打开状态,所有这些都可以在后台打开。当用户点击其他地方时,菜单就会消失。

如何做到这一点?我应该继承 NSMenuItem 并以某种方式拦截鼠标点击吗?在弹出的菜单上覆盖一个透明的 NSView 并再次以某种方式拦截点击?我愉快地提出了这些建议,但我在实现其中任何一个时都会遇到麻烦......将不胜感激指向正确的覆盖方法的指针。

【问题讨论】:

    标签: objective-c nsmenu


    【解决方案1】:

    可以不使用菜单,而是使用可折叠框。我在许多应用程序(也由 Apple 提供)中看到了这一点,所以我想这是推荐的多选样式指南。 当您单击披露按钮时,可折叠框会展开,它会释放所有所需的项目 - 就像带有复选框的表格视图。 在这种情况下,此框下方的视图必须向下移动,以免干扰该框。

    再次单击显示按钮会将框缩小回原来的位置。效果类似于关闭菜单。

    【讨论】:

      【解决方案2】:

      通常,您不应将控件弯曲得太远,超出其原始意图。用户希望弹出按钮在做出选择后关闭。我认为您不应该或可以强制 NSPopUpButtonCell 以这种方式运行。如果你这样做,你将继承和修改控件,以至于它可能会在未来版本的 Mac OS X 中改变/破坏。你还必须担心用户认为菜单会在制作后关闭的可用性问题一个选择。

      您可能会考虑编写您自己的 NSView 子类来像您描述的菜单按钮一样工作。用户点击按钮后。您需要使用 NSBorderlessWindowMask 作为样式掩码来创建一个没有边框的新 NSWindow。该窗口的内容视图应该是您在其中实现菜单选择的另一个自定义视图。

      【讨论】:

      • 感谢您的评论。我当然会考虑编写我自己的 NSView 子类。然而,免费处理 NSPopUpButtonCell/NSMenu 组合附带的所有子菜单、图像、开/关状态等似乎是一种皇家痛苦。所以......我可以理解编写自己的 NSView 是一种方法,但我坦率地说,如果我完全模仿 NSPopUpButton 但只是改变我想要改变的行为——那么我不妨继续“将[the]控制弯曲得太远超出其初衷”!我的意思是,结果是一样的,所以站在仪式上似乎没有意义。
      猜你喜欢
      • 2019-01-19
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 2014-05-01
      相关资源
      最近更新 更多