2013-04-05 88 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