2013-11-10 27 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

那里,固定错字。 –

回答