2011-02-26 43 views
8

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

这是当我创建我的菜单和历史,你可以看到一个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小时的情况。谢谢。

回答

8

您正在设置目标,但是没有任何操作。尽量不要设置目标。这可能会使其始终处于启用状态,在这种情况下,您可能必须手动启用或禁用菜单项。

Here is the documentation关于如何启用菜单项。

+0

谢谢你做了,但是如果我不设置操作方法怎么办?事实上,我甚至不需要设定目标,我不知道为什么我在那里。无论如何,我会尝试你所说的,谢谢你的帮助。 – user635064 2011-02-26 01:49:01

2

我不得不重写validateMenuItem方法return true

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

它没有实际使用的验证方法,直到我设定的目标进行自我虽然喜欢你

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

感谢这为我工作。 – adev 2017-07-26 22:19:52