如何关闭OSX窗口?

4

我想创建一个应用程序,主要只涉及状态栏。到目前为止,我已经使用 NSMenuNSStatusBar 创建了状态栏项目,并使用以下代码在载入时删除了 Dock 图标:

[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];

但我仍然有一个问题,当打开应用程序时会出现 NSWindow 窗口。

我该如何防止这种情况发生?同时我也希望能够重新打开它。


我想到了一种可怕的方法来关闭它:

[_mainView setFrame:CGRectMake(0, 0, 0, 0)];

_mainView是我的视图控制器中连接到nswindow的主要NSView

然后我想再次打开窗口,但这次要用一个表格。但是我遇到了错误:

<Warning>: void CGSUpdateManager::log() const: conn 0x18de3 token 0x31fffffffffdafd

将框架重置回原始大小时。

如果我关闭了NSView,则意味着我无法重新打开该视图。


这是一个可以控制视图控制器所在窗口是打开还是关闭的应用程序的冗长解释。


@Fennelouski,你能详细解释一下吗? - maxisme
1
如果你根本不需要窗口控制器,可以在Interface Builder中将其删除(以及视图控制器)。 - vadian
但是我写的整个程序就不能在加载时运行了? - maxisme
我一直使用的隐藏窗口的方法是 [_window orderOut:self]; ... 如果你想要这样做,那么如果你想要显示它,就用 [_window makeKeyAndOrderFront:self]; - l'L'l
我该如何创建 _window 呢? - maxisme
显示剩余4条评论
1个回答

3
为了创建一个仅在状态栏中显示而不出现在Dock或应用程序选项卡中的NSStatusBar项目,并且不显示任何常规菜单,例如文件、编辑、视图等等。您需要向应用程序info.plist添加Application is agent (UIElement) - (Boolean) YES键值对。

enter image description here


同时确保在属性检查器中关闭窗口的“启动时可见”选项。

更新:

在一个无故事板应用程序(OS X)中

在IB中将“启动时可见”设置为关闭,可以阻止窗口在启动时出现。

但是,在一个故事板应用程序中,这种方法不起作用。

“启动时可见”已经被设置为关闭。但是,无论如何,窗口总是会显示。

(我认为这是苹果公司的人机界面指南和故事板设计的一部分。可能是因为它们源自iOS,因此应该始终存在一个窗口。)

可能有几种方法可以改变这种行为,但我发现,如果在NSWindowController的属性检查器中取消选中“初始控制器”

enter image description here

这将停止窗口在启动时显示。这是有道理的,因为应用程序现在没有任何指令来最初显示任何内容。
要打开窗口,您可以简单地将菜单项链接到IB中NSWindowController的“Presenting Segue”“Show:”方法。
如果您想通过编程方式打开窗口,则必须在代码中重新指向控制器。
  • 在IB中再次选择NSWindowController
  • 进入Identity Inspector。
  • 将Storyboard ID命名为"Main"

enter image description here

  • Now go to your AppDelegate.h file and add a the Property and IBAction:

             @property (strong) IBOutlet NSWindowController *winController;
    
              -(IBAction)showWindow:(id)sender;
    
  • Then go to the AppDelegate.m file and add this code in the applicationDidFinishLaunching

             NSStoryboard *storyBoard = [NSStoryboard storyboardWithName:@"Main" bundle:nil];
    
             NSWindowController * main = [storyBoard instantiateControllerWithIdentifier:@"Main"];
    
             _winController = main;
    
(注意仅通过直接将控制器与AppDelegate中的属性链接并不能让它正常工作,这种方法对我无效)
  • Now add the IBAction code to the AppDelegate.m

             -(IBAction)showWindow:(id)sender {
    
              [_winController showWindow:self];
    
    
             }
    
你需要像平常一样将IBAction与你想要通过IB打开窗口的任何菜单项链接起来。

@Maximilian 关于“启动时可见”,您有什么想法? - markhunte
这与NSApplicationActivationPolicyAccessory完全相同。 - l'L'l
@Maximilian 尝试将其注释掉,然后查看属性面板是否有效。 - markhunte
我将其注释掉了,没有任何区别。 - maxisme
我该如何在NSWindow中使用setVisible:呢?! - maxisme
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接