如何启用主菜单项“复制”?

时间:2013-04-05 19:42:09

标签: objective-c xcode macos

我的主菜单项“copy”无法点击:

enter image description here

但我在Xcode中启用它:

enter image description here

我的代码中没有任何主菜单项。 我能做什么?

1 个答案:

答案 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会检查该对象是否实现了NSMenuvalidateMenuItem:方法。如果没有,则启用菜单项。如果是,则菜单项的启用状态由方法的返回值确定。

默认情况下(使用“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: