8

我有一个名为 history 的 NSMenuItem,它位于一个名为 menu 的 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"]];
    }

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

请帮忙,我在过去的两个小时里一直在努力解决这个问题。谢谢。

4

3 回答 3

9

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

这是有关如何启用菜单项的文档。

于 2011-02-26T01:44:04.743 回答
3

I had to override the validateMenuItem method to return true:

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

It didn't actually use the validation method until I set target to self though like you did with

menu.addItemWithTitle("An Item", action: #selector(itemPressed), keyEquivalent: "")?.target = self
于 2016-05-12T19:19:58.870 回答
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...")
}
于 2021-08-10T19:33:38.617 回答