2013-11-10 30 views
3

我的應用程序具有由.xib文件和自定義窗口控制器類定義的「檢查器」面板:AdjustmentsWindow.xibAdjustmentsWindowController.m在Cocoa Desktop中切換「顯示/隱藏」菜單項的最佳方式

我想要在應用程序的主菜單欄中有一個Window -> Show Adjustments菜單項,選中時將顯示調整窗口。我將NSObject實例放入包含主菜單的xib中,並將其類更改爲「AdjustmentsWindowController」。我還將菜單項action連接到控制器的-showWindow:方法。到目前爲止這麼好:窗口控制器在應用程序啓動時實例化,並且當您選擇菜單項時,它將顯示其窗口。

但是,當窗口已經可見(有效切換可視性)時,我希望相同的菜單項加倍爲「隱藏調整」。因此,這裏是我做過什麼:

AdjustmentsWindowController.m:

- (void) windowDidLoad 
{ 
    [super windowDidLoad];  
    [[self window] setDelegate:self]; 
} 

- (void) showWindow:(id)sender 
{ 
    // (Sent by 'original' menu item or 'restored' menu item) 

    [super showWindow:sender]; 

    // Modify menu item: 

    NSMenuItem* item = (NSMenuItem*) sender; 
    [item setTitle:@"Hide Adjustments"]; 
    [item setAction:@selector(hideWindow:)]; 
} 


- (void) hideWindow:(id) sender 
{ 
    // (Sent by 'modified' menu item) 

    NSMenuItem* item = (NSMenuItem*) sender; 

    // Modify back to original state: 

    [item setTitle:@"Show Adjustments"]; 
    [item setAction:@selector(showWindow:)]; 
    [self close]; 
} 

- (void) windowWillClose:(NSNotification *)notification 
{ 
    // (Sent when user manually closes window) 

    NSMenu* menu = [[NSApplication sharedApplication] mainMenu]; 

    // Find menu item and restore to its original state 

    NSMenuItem* windowItem = [menu itemWithTitle:@"Window"]; 
    if ([windowItem hasSubmenu]) { 
     NSMenu* submenu = [windowItem submenu]; 
     NSMenuItem* item = [submenu itemWithTitle:@"Hide Adjustments"]; 
     [item setTitle:@"Show Adjustments"]; 
     [item setAction:@selector(showWindow:)]; 
    } 
} 

我的問題是,這是正確的/聰明/最優雅的方式來實現這一目標?我的意思是,這是可可應用程序中非常標準的行爲(參見Numbers的「Inspector」),其他人怎麼做呢?

改進它的一種方法是避免將菜單項恢復到其原始標題/操作的代碼重複。此外,理想情況下,我會用NSLocalizedString()調用來替換標題字符串。但也許有一個更優雅的,標準的做法,我不知道......

+1

> 5月應用程序有一個...我想他的意思是我的應用程序有一個。我花了半分鐘才通過第一句話。 –

+0

那裏,固定錯字。 –

回答