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

问题描述 投票:0回答:3

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

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

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

我试过[[NSApp mainMenu] cancelTracking],但它没有完成这项工作

有没有简单的方法来做到这一点?

objective-c cocoa nsmenu
3个回答
2
投票

您可以在NSApp上使用-setPresentationOptions:方法隐藏和显示标准OS UI的许多部分,包括菜单栏和Dock。请注意,您必须同时隐藏菜单栏和Dock:

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

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

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


0
投票

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


0
投票

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

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

话虽如此,您可以通过禁用相关的菜单项来阻止匿名用户打开首选项窗口。我个人更喜欢在偏好窗口中实际禁用相关控件,因此用户可以探索不同的选项,但也了解他们需要进行身份验证。您可以按照Apple用于macOS系统首选项窗口的模型,该窗口将锁定许多(但不是全部)首选项窗格,具体取决于特定窗格,以及用户是否进行了身份验证。

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

如果您仍然需要隐藏菜单栏,您可以随时做:

[NSMenu setMenuBarVisible:(BOOL)onOff];

但我相信最好使用@ jatoben的答案解决方案,如NSApplicationpresentationOptions,因为这可以让你真正禁用functionalirty。只使用[NSMenu setMenuBarVisible:(BOOL)onOff]隐藏菜单栏不会禁用menuItems的快捷方式,因此您仍然可以使用⌘,显示首选项窗口。

在旁注中,我相信如果您只是使用密码对话框,您可以省去所有这些麻烦

NSModalSession session = [NSApp beginModalSessionForWindow:passwordDialog];
[NSApp runModalSession:session];

这将显示模块化应用程序对话框,这意味着所有其他窗口以及几乎所有菜单项都会自动禁用...

© www.soinside.com 2019 - 2024. All rights reserved.