2013-04-05 85 views

回答

8

“Enabling Menu Items” in Application Menu and Pop-up List Programming Topics这样说:

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

这:

如果菜单项的目标不能被设置(即,如果它是nil - 通常,如果菜单项连接到急救员)和NSMenu对象不是上下文菜单,则NSMenu使用响应者链(在Cocoa Event Handling Guide中的“The Responder Chain”中描述)来确定目标。如果在实施该项目的动作的响应者链中没有对象,则该项目被禁用。 如果响应者链中有一个实现项目动作的对象,则NSMenu将检查该对象是否实现validateMenuItem:validateUserInterfaceItem:方法。如果没有,则菜单项被启用。如果是,则菜单项的启用状态由方法的返回值确定。

默认情况下(当您创建使用“Cocoa应用程序”模板的项目),复制菜单项的目标是急救员(nil)和动作是copy:。因此,您需要在响应者链中的某个项目上实施copy:方法。这足以启用菜单项。如果您想更精确地控制启用菜单项的时间,则还可以执行validateMenuItem:以检查哪个菜单项正在验证,并根据情况返回YESNO

例如,应用程序委托位于响应者链中。所以,你可以将这个方法添加到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:

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

谢谢!它的帮助! – Kepler 2013-04-05 20:04:21