NSMenuItem没有启用?

时间:2011-02-26 00:41:50

标签: objective-c cocoa xcode nsmenuitem

我有一个名为history的NSMenuItem,它位于一个名为菜单的NSMenu中。当我的程序启动时,历史记录没有子菜单,因此禁用它。然后在某些时候,我需要一个历史子菜单,所以我创建它,使它成为历史的子菜单。历史旁边出现一个箭头,告诉我子菜单在那里。但历史仍然是残疾人。我尝试过setEnabled但不起作用。请帮忙。这是我的代码:

这是我创建菜单和历史记录,因为您可以在菜单中看到NSMenuItem。

    menu = [[NSMenu alloc] initWithTitle:@"Menu"];
[[menu addItemWithTitle:@"History" action:nil keyEquivalent:@""] setTarget:self];
[[menu addItemWithTitle:@"Settings" action:@selector(loadSettings:) keyEquivalent:@""] setTarget:self];
[[menu addItemWithTitle:@"Quit" action:@selector(terminateApp:) keyEquivalent:@""] setTarget:self];

此时,历史记录被禁用(灰色)。 然后在程序的某个地方我需要有一个历史子菜单,所以:

        if (historyMenu == nil) {
        historyMenu = [[NSMenu alloc] initWithTitle:@"Lyrics history"];
        [menu setSubmenu:historyMenu forItem:[menu itemWithTitle:@"History"]];
    }

我现在看到历史旁边的箭头,但它仍然是灰色的。

请帮助,我一直试图弄清楚最近2个小时。感谢。

3 个答案:

答案 0 :(得分:8)

您正在设置目标但是没有操作。尽量不设置目标。这可能会一直启用它,在这种情况下,您可能必须手动启用或禁用菜单项。

关于如何启用菜单项的

Here is the documentation

答案 1 :(得分:2)

我必须将validateMenuItem方法覆盖为return true

override func validateMenuItem(menuItem: NSMenuItem) -> Bool {
    return true
}

在我将目标设置为self之前,它实际上并没有使用验证方法,就像你使用

那样
menu.addItemWithTitle("An Item", action: #selector(itemPressed), keyEquivalent: "")?.target = self

答案 2 :(得分:0)

macOS 将根据是否正在处理自动处理 enabled 状态。因此,如果您要设置 action,您还需要设置操作的目标。

let menu = NSMenu()
let itemPress = menu.addItem(withTitle: "some name..", action: #selector(press), keyEquivalent: "")
itemPress.target = self

和目标:

@objc func press() {
    print("pressed...")
}