菜单应用程序与窗口应用程序?

时间:2012-09-08 01:07:25

标签: objective-c macos cocoa

我有一个有两种类型接口的应用程序 - 它作为菜单栏应用程序和窗口应用程序存在。但是它在两个州都不能同时存在。

如何让用户点击允许他/她更改状态的按钮?

例如,如果我的应用程序当前是一个窗口,当用户单击按钮时,我希望它更改为菜单栏应用程序,窗口应该消失。但是,如果用户再次单击,则所有菜单栏信息都将消失,窗口应重新出现。

应用程序非常系统繁重,因此我无法承受菜单版本和窗口版本同时工作。

我将如何做到这一点?

我正在研究OSX Mountain Lion,需要Objective-C / C的解决方案。

2 个答案:

答案 0 :(得分:1)

假设您知道如何在NSWindowNSStatusItem中单独显示您的用户界面,那么您可以通过以下方式从一个用户界面“切换”到另一个用户界面:

  1. 隐藏NSWindow并显示NSStatusItem;或

  2. 隐藏NSStatusItem并显示NSWindow

  3. 您可以使用-(void)orderOut:隐藏NSWindow,并且可以使用以下内容恢复其可见性:-(void)orderFront:

    对于您的NSStatusItem,您可以创建(请参阅:–statusItemWithLength:)并在需要时将其删除(请参阅:– removeStatusItem:)。

    编辑:

    如果您需要对NSWindow内的UI元素执行任何操作,可以通过迭代它们来执行此操作:

    for(NSView* view in [[window contentView] subviews])
    {
       [view ...];
    }
    

    如果您的NSWindow内容是由NSControls构成的,则可以像这样禁用它们:

    for(NSView* currentView in [[window contentView] subviews]) {
    
        if( [currentView respondsToSelector:@selector(setEnabled:)] )
        {
            [(NSControl*)currentView setEnabled:NO];
        }
    }
    

    如果您有一个复杂的控件层次结构,则可以创建一个方法并以递归方式调用它。

答案 1 :(得分:1)

  

然而,它在两个州都不能同时存在。

为什么不呢?我建议您考虑a different approach,其中您将应用程序的显示方式与用户分开。这样,系统繁重的代码在控制器中只运行一次,窗口和状态栏项都可以显示操作进度或结果或者您想要显示的任何内容。

通常的做法是使用状态栏项来切换窗口可见性或显示控制主窗口的菜单。但是您可以使用它来显示具有小颜色变化(黑色和白色首选)或不同图像的不同应用状态(通知类型),或者在隐藏主窗口时显示带有窗口界面的简化版本的弹出窗口,等等

当用户关闭或显示窗口时,它不必影响主应用程序操作。它只是隐藏了进度/结果的具体视图。添加特定按钮或菜单项以暂停/停止/开始操作。