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