validateMenuItem:未调用

时间:2013-03-03 10:24:25

标签: objective-c macos cocoa nsmenu

我面临着一种奇怪的情况。我有一个带有子菜单的NSMenu。子菜单的内容以编程方式填充。在我的validateMenuItem:方法中,我可以看到所有正在检查的项目(父项的项目)以及子项目(一旦我点击子菜单),除了我自动填充的子菜单中的项目。

为什么?难道我做错了什么?关于如何解决这个问题的任何想法?

3 个答案:

答案 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(:)方法:

  1. 在实现NSMenuItemValidation的类中符合NSPopUpButton
  2. 所有NSMenuItem都必须为实现NSMenuItemValidation协议的对象设置一个操作和一个目标。
  3. 实施validateMenuItem(:)方法。
  4. 为NSMenuItem实施dummyAction(:)方法,该方法不执行任何操作。
  1. 必须设置NSPopUpButton“项目:自动启用” autoenablesItems

版本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链接到源代码。 (即将推出)。