我面临着一种奇怪的情况。我有一个带有子菜单的NSMenu
。子菜单的内容以编程方式填充。在我的validateMenuItem:
方法中,我可以看到所有正在检查的项目(父项的项目)以及子项目(一旦我点击子菜单),除了我自动填充的子菜单中的项目。
为什么?难道我做错了什么?关于如何解决这个问题的任何想法?
答案 0 :(得分:12)
以下是解决方案:
Cocoa在validateMenuItem:
的动作选择器所在的类中查找NSMenuItem
方法。
因此,如果您的NSMenuItem
的操作选择器(例如@selector(someSelector:)
)已在SomeClass
中实施,请确保validateMenuItem:
中有SomeClass
方法如果你想验证相应的菜单项也是如此。
答案 1 :(得分:0)
@Kameleon博士有正确的答案。
如果可以的话,我会添加一个小点进行更新?我的代码最近在此区域中断,并在以前工作时停止调用validateMenuItem:。我没有注意到,因为唯一的症状是菜单项在应有的时候不再被禁用。
问题是Swift4。该方法必须使用@objc进行属性。在早期版本的Swift中,从NSObject,NSViewController等继承就足够了,但是随着新版本的Swift,4和5发生了变化。
p.s。将该方法放在扩展中似乎很好。
答案 2 :(得分:0)
以上答案并没有帮助我解决问题。我创建了一个单独的项目来了解何时调用validateMenuItem(:)
方法。
仅在以下情况下才会调用validateMenuItem(:)
方法:
NSMenuItemValidation
的类中符合NSPopUpButton
。NSMenuItemValidation
协议的对象设置一个操作和一个目标。validateMenuItem(:
)方法。dummyAction(:)
方法,该方法不执行任何操作。版本11.5(11E608c),Swift 5.0,DP:macOS 10.15。
代码:
import Cocoa
// 1) Conform to NSMenuItemValidation in the class which implements the NSPopUpButton.
class NSMenuItemValidationTestViewController: NSViewController, NSMenuItemValidation {
@IBOutlet weak var popupButton: NSPopUpButton!
// MARK: - ViewController lifecycle
override func viewDidLoad() {
super.viewDidLoad()
// .target and .action are set programmatically because menus are mostly build programmatically.
// 2) All NSMenuItems must have an action and target set to the object which implements the
// NSMenuItemValidation protocol.
self.popupButton?.menu?.items.forEach{( $0.target = self )}
self.popupButton?.menu?.items.forEach{( $0.action = #selector(dummyAction(_:)) )}
}
// MARK: - NSMenuItemValidation
// 3) Implement the validateMenuItem(:) method.
func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
print("Function: \(#function), line: \(#line)")
return true
}
// 4) Implement the dummyAction(:) method for NSMenuItem which doesn't do anything
@IBAction func dummyAction(_ sender: NSMenuItem?) {
print("Function: \(#function), line: \(#line)") }
}
// 5) The NSPopUpButton "Items: Autoenables" checkbox must be set to true in storyboard.
// or
// self.popupButton?.menu?.autoenablesItems = true
TODO:Github链接到源代码。 (即将推出)。