我的主菜单项“copy”无法点击:
但我在Xcode中启用它:
我的代码中没有任何主菜单项。 我能做什么?
答案 0 :(得分:8)
“Enabling Menu Items” in Application Menu and Pop-up List Programming Topics说:
默认情况下,每次发生用户事件时,
NSMenu
都会自动启用和禁用每个可见的菜单项。您还可以使用NSMenu
的{{1}}方法强制更新菜单。
和此:
如果未设置菜单项的目标(即,如果它是
update
- 通常是菜单项连接到First Responder)并且nil
对象不是上下文菜单,那么NSMenu
使用响应者链(在“The Responder Chain”中的Cocoa Event Handling Guide中描述)来确定目标。如果响应者链中没有实现项目操作的对象,则禁用该项目。 如果响应者链中有一个实现项目操作的对象,则NSMenu
会检查该对象是否实现了NSMenu
或validateMenuItem:
方法。如果没有,则启用菜单项。如果是,则菜单项的启用状态由方法的返回值确定。
默认情况下(使用“Cocoa Application”模板创建项目时),“复制”菜单项的目标是“第一响应者”(validateUserInterfaceItem:
),操作为nil
。因此,您需要在响应程序链中的某个项目上实现copy:
方法。这足以启用菜单项。如果您想要更精确地控制何时启用菜单项,您还可以实现copy:
以检查哪个菜单项正在验证,并根据需要返回validateMenuItem:
或YES
。
例如,应用程序委托位于响应程序链中。因此,您可以将此方法添加到NO
:
CMAppDelegate
这应足以启用“复制”菜单项。当然,选择编辑>复制只会将消息记录到控制台。您可以实际编写复制用户所选内容的代码。
如果您想要更精细的控制,请尝试为应用委派一个连接到“复制”菜单项的插座:
- (IBAction)copy:(id)sender {
NSLog(@"%@ %s", self, __func__);
}
在@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (strong) IBOutlet NSMenuItem *copyMenuItem;
@end
中连接插座。然后你可以像这样实现MainMenu.xib
:
validateMenuItem: