0

我有一个具有两种类型界面的应用程序 - 它作为菜单栏应用程序和窗口应用程序存在。但是,它不能同时存在于两种状态中。

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

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

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

我将如何做到这一点?

我正在开发 OSX Mountain Lion,需要 Objective-C/C 中的解决方案。

4

2 回答 2

1

但是,它不能同时存在于两种状态中。

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

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

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

于 2012-09-17T11:40:19.993 回答
1

假设您知道如何在 a 中NSWindow分别显示您的 UI NSStatusItem,那么您可以通过以下方式从一个 UI“切换”到另一个 UI:

  1. 隐藏NSWindow并显示NSStatusItem; 或者

  2. 隐藏NSStatusItem并显示NSWindow.

您可以NSWindow使用隐藏隐藏:-(void)orderOut:,您可以使用恢复其可见性:-(void)orderFront:

至于您的NSStatusItem,您可以在需要时创建(参见:)–statusItemWithLength:并删除它(参见– removeStatusItem::)。

编辑:

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

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];
    }
}

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

于 2012-09-16T18:42:13.770 回答