首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSMenu willClose可以通知吗?

NSMenu willClose可以通知吗?
EN

Stack Overflow用户
提问于 2020-12-08 13:04:58
回答 1查看 189关注 0票数 0

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

我尝试过监视NSEvents,但是它是无用的,因为NSMenu没有包含它的NSWindow对象的公共属性。

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

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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-09 09:26:07

最后,我找到了解决办法。在按钮菜单关闭之前,不需要与系统战斗并更新某些内容。我找到了另一种方法,这很简单。

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

NSPopUpButton的初始菜单属性仅用于选定的项,立即删除非选定项。

我拦截单击按钮,以显示“属性menu”,而不是类的默认菜单。

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

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

更新

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65199508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档