【问题标题】:Is NSMenu willClose notitfication possible?NSMenu 是否会关闭通知?
【发布时间】:2020-12-08 13:04:58
【问题描述】:

NSMenu 对象是否可以在关闭之前而不是之后通知?它的委托有方法 didClose(_:) 但我想在它真正关闭之前更新它的项目,因为消失的动画太长了,眼睛可以看到变化。

我试图监控 NSEvents,但它没有用,因为 NSMenu 没有包含其 NSWindow 对象的公共属性。

理论上可以通过为每个菜单项创建自定义 NSViews 来实现。但我不喜欢这样,因为那样我将不得不绘制项目的所有绘图,包括选择和点击动画。

更新: 我尝试将 NSPopUpButton 子类化以跟踪菜单更新:

class CustomPopUpButton: NSPopUpButton {
    var isMenuShown: Bool = false
    var onClosingMenu: ((NSMenu)->())?
    
    override var needsDisplay: Bool {
        willSet {
            if let menu = self.menu, isMenuShown, newValue {
                onClosingMenu?(menu)
                isMenuShown = false
            }
        }
    }

    override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) {
        isMenuShown = true
        super.willOpenMenu(menu, with: event)
    }
}

我并不为那段代码感到自豪,但它通常可以工作。然而,'onClosingMenu' 方法在菜单关闭动画完成后被调用。以前没有。

我想要实现的视频:https://drive.google.com/file/d/1GAceKp-fTlurxSybdB3h0epVZrtQjthm/view?usp=sharing

【问题讨论】:

  • 我认为你可以尝试在NSMenu.willSendActionNotification处理程序中做你想做的事,因为一旦发送任何项目操作,菜单就会关闭。
  • 只有当用户点击一个项目时才有效。但是可以通过单击菜单外部或按 Esc 键来关闭菜单。我坚持这一点:(
  • 不清楚你想实现什么。 NSMenu 有自己的验证/更新流程,那么有什么问题?
  • 我想显示系统中可用字体的选择器。比方说,就像在 Apple Pages 中一样。在该应用程序中,带有可用字体的 NSMenu 的 NSPopupButton 正在根据菜单显示状态更改所选项目的显示选项。如果显示菜单,则所选项目具有 NSAttrbiutedString 标题。但是在菜单关闭之前,它会删除属性,当菜单关闭时,您会看到正常的按钮字体,即默认字体。我能够模仿这种行为,除了关闭菜单时的标题更新。我在 didClose 方法中这样做,并且标题字体的更改太明显了
  • 我还是不明白你想要完成什么。

标签: swift appkit nsmenu


【解决方案1】:

终于,我找到了解决方案。无需在按钮菜单关闭之前与系统抗争并更新某些内容。我找到了另一种方法,很简单。

我对 NSPopUpButton 进行了子类化,并在子类中创建了另一个 NSMenu,称为“attributedMenu”。覆盖了 NSPopUpButton 处理菜单项(插入和删除)的所有属性,并将该操作重定向到“attributedMenu”属性。

NSPopUpButton 的初始菜单属性我只用于选定的项目,立即删除未选定的项目。

我拦截点击按钮显示'attributedMenu',而不是类的默认菜单。

如果我选择多个元素,该解决方案甚至可以显示“多个值”标题。当您选择使用多种字体编写的文本时,就像在 Apple Pages 的字体选择器中一样。只需添加一个标题为“Multiple Values”的 NSMenuItem 并调用 super 来选择它。

就是这样,现在它就像在 Apple Pages 字体选择器按钮中一样完美。只要我没有触及 NSPopUpButton 类的原始“菜单”属性。

更新

已将子类上传到 GitHub:https://github.com/CineDev/AttributedPopUpButton

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多