如何暂时隐藏主菜单(NSMenu)?

时间:2013-04-19 20:32:31

标签: objective-c cocoa nsmenu

我正在尝试实现一项功能来密码保护我的可可应用程序。所以在我的AppDelegate中,如果在窗口上正确输入密码,我将通过调用NSApp runModelforWindow方法调出主应用程序窗口。

它工作正常,但在首选项中我允许用户更改密码。所以这意味着为了防止用户入侵,我必须隐藏主菜单,直到密码输入正确。

我不想通过使用removeItemAtIndex删除某些菜单项或以编程方式设置目标操作来调用方法来调出首选项窗口。相反,我想暂时隐藏[NSApp mainMenu]。我搜索它,似乎无法找到任何方法,如setHidden:YES以隐藏它。

我已经尝试了[[NSApp mainMenu] cancelTracking]但它没有完成这项工作

有没有简单的方法呢?

3 个答案:

答案 0 :(得分:2)

您可以使用NSApp上的-setPresentationOptions:方法隐藏和显示标准操作系统UI的许多部分,包括菜单栏和Dock。请注意,您必须隐藏两者菜单栏和Dock:

/* Hide */
[NSApp setPresentationOptions:[NSApp presentationOptions] |
                               NSApplicationPresentationHideMenuBar |
                               NSApplicationPresentationHideDock];

/* Show */
[NSApp setPresentationOptions:[NSApp presentationOptions] ^
                               NSApplicationPresentationHideMenuBar ^ 
                               NSApplicationPresentationHideDock];

这是一个非常具有破坏性的UI体验。考虑在屏幕上显示密码对话框时,禁用您不希望用户访问的任何菜单项或UI元素。

答案 1 :(得分:0)

不幸的是,没有简单的方法来隐藏主菜单 - 它总是显示,或者总是隐藏(取决于info.plist标志)。以及Dock图标。请参阅LSUIElement。 有一个技巧可以在最初隐藏时显示此菜单,但没有好的方法可以在运行时隐藏/显示它。

答案 2 :(得分:0)

如果您真的想使用密码保护(使用)您的应用程序,那么正如您已经得出的结论那样,隐藏菜单栏将无济于事。

为防止匿名用户执行需要身份验证的操作,您实际上需要在代码中创建逻辑以保护这些操作,并在每次用户尝试执行某项操作时检查用户是否确实进行了身份验证(选择菜单项或按一个按钮。)

话虽如此,您可以通过禁用相关菜单项来防止匿名用户例如打开首选项窗口。我个人更希望实际上在首选项窗口中禁用相关控件,以便用户可以浏览不同的选项,但也了解他们需要进行身份验证。您可以遵循Apple用于macOS“系统偏好设置”窗口的模型,该模型将锁定许多(但不是全部)首选项窗格,具体取决于特定的窗格以及用户是否进行了身份验证。

一个很好的起点可能是苹果开发者网站上的相关文档。例如:https://developer.apple.com/documentation/securityfoundation

如果您仍然只需要隐藏菜单栏,则可以随时执行以下操作:

[NSMenu setMenuBarVisible:(BOOL)onOff];

但是我认为最好使用@jatoben的答案中的解决方案,例如NSApplication的{​​{1}},因为这可以使您真正禁用功能性。仅使用presentationOptions隐藏菜单栏不会禁用menuItems的快捷方式,因此您仍然可以使用[NSMenu setMenuBarVisible:(BOOL)onOff]显示首选项窗口。

在旁注中,我相信如果您仅使用来显示密码对话框,您将省去所有的麻烦

⌘,

这将为您显示应用程序的模态对话框,这意味着将自动禁用所有其他窗口以及几乎所有菜单项…