Objective c 如何启用主菜单项;复制;?

Objective c 如何启用主菜单项;复制;?,objective-c,xcode,macos,Objective C,Xcode,Macos,我的主菜单项“复制”不可单击: 但我在Xcode中启用了它: 我没有代码中主菜单项的任何出口。 我能做什么?说: 默认情况下,每次发生用户事件时,NSMenu都会自动启用和禁用每个可见的菜单项。您还可以使用NSMenu的update方法强制菜单更新 这是: 如果未设置菜单项的目标(即,如果它是nil-通常如果菜单项连接到第一响应程序),并且NSMenu对象不是上下文菜单,则NSMenu使用响应程序链(如中所述)确定目标。如果响应器链中没有实现该项操作的对象,则该项将被禁用。 如果响应器链中有

我的主菜单项“复制”不可单击:

但我在Xcode中启用了它:

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

说:

默认情况下,每次发生用户事件时,
NSMenu
都会自动启用和禁用每个可见的菜单项。您还可以使用
NSMenu
update
方法强制菜单更新

这是:

如果未设置菜单项的目标(即,如果它是
nil
-通常如果菜单项连接到第一响应程序),并且
NSMenu
对象不是上下文菜单,则
NSMenu
使用响应程序链(如中所述)确定目标。如果响应器链中没有实现该项操作的对象,则该项将被禁用。 如果响应器链中有一个对象实现了该项的操作,
NSMenu
然后检查该对象是否实现了
validateNuItem:
validateUserInterfaceItem:
方法。如果没有,则菜单项已启用。如果是,则菜单项的启用状态由方法的返回值确定

默认情况下(使用“Cocoa应用程序”模板创建项目时),复制菜单项的目标是第一响应者(
nil
),操作是
Copy:
)。因此,您需要在响应者链中的某些项目上实现
copy:
方法。这足以启用菜单项。如果希望更精确地控制菜单项的启用时间,还可以实施
validateNuItem:
以检查正在验证的菜单项,并根据需要返回
YES
NO

例如,应用程序委托位于响应程序链中。因此,您可以将此方法添加到
CMAppDelegate

- (IBAction)copy:(id)sender {
    NSLog(@"%@ %s", self, __func__);
}
这应足以启用“复制”菜单项。当然,选择Edit>Copy只会将消息记录到控制台。由您来实际编写复制用户所选内容的代码

如果您想要更精细的控制,请尝试为应用程序代理提供一个连接到“复制”菜单项的插座:

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (strong) IBOutlet NSMenuItem *copyMenuItem;

@end
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
    if (menuItem == self.copyMenuItem) {
        NSLog(@"%@ %s %@", self, __func__, menuItem);
        return [self shouldEnableCopyMenuItem];
    }
    return NO;
}