Objective c 从状态栏中的菜单选择重新打开“我的应用程序”窗口

Objective c 从状态栏中的菜单选择重新打开“我的应用程序”窗口,objective-c,macos,statusbar,Objective C,Macos,Statusbar,当按下红色X时,我的窗口将消失,但按照设计,我的状态栏项目仍保留在状态栏中 单击状态栏项目时,会打开一个菜单。选择之一是重新打开应用程序。它可以在应用程序控制器中调用操作,但我不确定如何打开应用程序的窗口。我读到了 [window makeKeyOrderFront:self]; 将完成此操作,但编译器无法识别“窗口”。我不熟悉objective c/cocoa,所以我肯定我遗漏了一些明显的东西。这里的window是用于存储应用程序中的NSWindow*对象的变量-它假设您仍然将其保存在一个类

当按下红色X时,我的窗口将消失,但按照设计,我的状态栏项目仍保留在状态栏中

单击状态栏项目时,会打开一个菜单。选择之一是重新打开应用程序。它可以在应用程序控制器中调用操作,但我不确定如何打开应用程序的窗口。我读到了

[window makeKeyOrderFront:self];

将完成此操作,但编译器无法识别“窗口”。我不熟悉objective c/cocoa,所以我肯定我遗漏了一些明显的东西。

这里的
window
是用于存储应用程序中的
NSWindow*
对象的变量-它假设您仍然将其保存在一个类中(通常在应用程序委托中-默认的Xcode应用程序委托模板甚至会为
窗口创建一个属性
)。但是,所有这一切都取决于应用程序的类型——如果应用程序基于文档,则这应该是全自动的(您可以调用
openUntitledDocumentAndDisplay:error:
,以创建新文档)。如果不是,则实际上完全由您的代码来管理窗口-通常在应用程序委托中。

此处
window
是用于存储应用程序中的
NSWindow*
对象的变量-它假定您仍在某个类中持有它(通常在应用程序委托中-默认的Xcode应用程序委托模板甚至会为
窗口创建一个属性
)。但是,所有这一切都取决于应用程序的类型——如果应用程序基于文档,则这应该是全自动的(您可以调用
openUntitledDocumentAndDisplay:error:
,以创建新文档)。如果不是,则实际上完全由您的代码来管理窗口-通常在app delegate中。

我最近解决了这个问题,以下是对我有效的方法。所有三件事都在AppDelegate中处理:

//对重新打开应用程序菜单选择的响应

- (IBAction)showMainWindow:(id)sender
{
    [self applicationShouldHandleReopen:nil hasVisibleWindows:YES];
    [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
}
//如果您希望在用户关闭主窗口后重新显示它,则需要此选项

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [_window setReleasedWhenClosed:NO]; 
}
- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag{
    [_window setIsVisible:YES];
    return YES;
}
//如果您希望在用户关闭主窗口后重新显示它,则需要此选项

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [_window setReleasedWhenClosed:NO]; 
}
- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag{
    [_window setIsVisible:YES];
    return YES;
}

我最近解决了这个问题,以下是对我有效的方法。所有三件事都在AppDelegate中处理:

//对重新打开应用程序菜单选择的响应

- (IBAction)showMainWindow:(id)sender
{
    [self applicationShouldHandleReopen:nil hasVisibleWindows:YES];
    [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
}
//如果您希望在用户关闭主窗口后重新显示它,则需要此选项

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [_window setReleasedWhenClosed:NO]; 
}
- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag{
    [_window setIsVisible:YES];
    return YES;
}
//如果您希望在用户关闭主窗口后重新显示它,则需要此选项

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [_window setReleasedWhenClosed:NO]; 
}
- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag{
    [_window setIsVisible:YES];
    return YES;
}

好的,我在应用程序委托中看到了窗口变量。我想我不明白这些东西是如何联系在一起的,或者应用程序委托到底是什么。所以听起来我需要向应用程序控制器传递一个指向窗口对象的指针,这样我才能访问它。但是我不知道如何做。看起来好像没有cont的实例在代理中滚动。您可以始终使用
[[NSApp delegate]窗口]
假设您使用标准的Xcode模板在应用程序委托中创建窗口属性。好的,我在应用程序委托中看到了窗口变量。我想我不明白这些东西是如何链接在一起的,或者应用程序委托到底是什么。所以听起来我需要将指向窗口对象的指针传递给应用程序控制器我可以访问它。但我不知道如何访问。代理中似乎没有控制器的实例。如果您使用了在应用程序代理中创建窗口属性的标准Xcode模板,则始终可以使用
[[NSApp delegate]窗口]