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
发布于 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
https://stackoverflow.com/questions/65199508
复制相似问题