【问题标题】:Mac app, menuitem to bring main window to front grayed out on close/minimizeMac应用程序,将主窗口置于前面的菜单项在关闭/最小化时变灰
【发布时间】:2012-10-08 15:29:38
【问题描述】:

我正在尝试添加一个菜单项来显示主窗口。它在窗口没有被最小化或关闭(黄色 - 和红色 x 按钮)时启用,但当它有时,菜单项会变灰。这当然是无用和愚蠢的。 :)

另一个菜单项,文件/页面设置...没有以相同的方式灰显(最小化/关闭时)。我发现这个菜单项和我创建的菜单项之间的 IB 没有区别,除了标题。两者都连接到 First Responder 选择器(runPageLayout:用于页面设置,showWindow:用于我的),都具有键盘快捷键,并且都已启用。

同样,父菜单项是相同的,除了标题。

当用户按下红色 x 或黄色 - 按钮时,如何确保此 Show Main Window 菜单项可用?

编辑: 我通过取消选中父菜单项的 Auto Enables Items 使菜单项不灰显。

这使得应用程序的标准 NSDocument 类中的这个方法被调用:

- (IBAction)clickMinimizeButton:(id)sender {
    NSWindow *ww=[[NSApplication sharedApplication] mainWindow];
    NSLog(@"%@",ww);
}

而且 ww 是一个有效的对象。

问题是,我无法从最小化/关闭状态恢复窗口,因为当它被调用时,方法没有被调用。

如何在窗口最小化/关闭时调用此方法?我只想做与最小化或关闭点击相反的操作。

应用程序中只有一个窗口,再次单击停靠图标确实会显示该窗口,但 Apple 需要一个菜单​​项来执行完全相同的操作。

似乎我必须将菜单项连接到由我创建的自定义应用程序方法(例如,肯定没有应用程序方法恢复所有窗口),但我不知道在哪里声明它,因为我'我对 Cocoa 的经验不如我对 Cocoa Touch 的经验。

编辑 2: 从上面开始,我在应用程序委托中创建了一个方法并将其连接到菜单项。即使最小化,这也会调用该方法,但我不知道恢复主窗口的正确代码。这种绝望的尝试当然只会激活已经处于活动状态的应用程序,而不是最小化的窗口。

NSApplication *theapp=[NSApplication sharedApplication];
[theapp activateIgnoringOtherApps:YES];

所以这就是现在剩下的了。如何在默认应用程序中模拟标准的“全部放在前面”菜单项?我将看一下 Apple 的一些标准窗口化 Mac 应用程序。

编辑 3: 我创建了一个标准的 Cocoa 应用程序,当窗口最小化时,它也会使窗口菜单中的所有菜单项变灰。但是默认的 NSDocument 会自动添加到这些下方,并且不会变灰。我会对这样的解决方案感到满意。

出于某种原因,在我的 Window 菜单中,我的 NSDocument 不会自动出现。 Info.plist 是相同的(当然,除了指向不同命名的 NSDocument 类)。

我该怎么做

a) 以编程方式将文档添加到该菜单,

b) 让窗口菜单像在标准应用程序中一样自动添加它,或者

c) 用我的标准应用程序中表现如预期的窗口菜单替换我的“损坏”窗口菜单(如果是这种情况)?

【问题讨论】:

    标签: cocoa menu nsmenuitem


    【解决方案1】:

    尝试将您的方法重命名为其他名称。 showWindow: 已经在 NSWindowController 中声明,这可能会产生冲突。还要确保没有释放应该响应菜单项的对象。

    【讨论】:

    • 感谢您的回答!它没有发布。将它连接到另一种方法不起作用,因为还有一个障碍:不能最小化/关闭窗口才能调用该方法。
    • 您的方法是否通过主菜单中的 First Responder 对象连接?如果是,那么它应该可以工作。
    • 这是一个快速响应 :) 好吧,正如我在上面解释的那样,它在主窗口正常时调用,但在最小化或关闭时不会调用。我在 mainmenu.xib 中有一个 NSApplicationDelegate 对象,并在那里声明它会被调用,即使在最小化时也是如此。所以现在我只需要知道恢复主窗口的正确代码,请参阅上面编辑 2 中的第一次尝试(失败)。
    • 我不知道你在做什么,但我能够创建一个非常非常快速的演示并且它成功运行。 cl.ly/0j20272q3H1z
    • 是的,请参阅上面的最后一个实现。您单击哪个菜单项来恢复窗口?
    【解决方案2】:

    你实现了你的 showWindow 了吗?

    - (void)showWindow {
        if (!self.window) {
            [NSBundle loadNibNamed:@"MainWin" owner:self];
        }
    
        [self.window makeKeyAndOrderFront:self];
    }
    

    附言你的window 在窗口关闭时不能是autoreleased (Behavior -> Release When Closed)

    【讨论】:

    • 也许我的这篇文章可以在某种程度上帮助你:stackoverflow.com/questions/12843616/…
    • 感谢您帮助我。根本原因似乎是连接或类似原因使我的 NSDocument 文档没有出现在 Window 菜单中,就像我刚刚创建的基于标准 NSDocument 的应用程序一样。应该在 NSDocument 类中重写这似乎是正确的,但它说 self.window,MyDocument * 类型的类不存在 getter 方法。
    猜你喜欢
    • 2020-01-16
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多