【问题标题】:Prevent NSMenu from creating multiple instances of same NSWindow when clicked防止 NSMenu 在单击时创建同一个 NSWindow 的多个实例
【发布时间】:2015-08-31 01:45:19
【问题描述】:

我有一个简单的 Cocoa 应用程序,它在单击 NSMenu 项目时启动 NSWindow。我正在通过 segue 启动窗口。问题是当我多次单击菜单项时,它会不断创建新窗口,而不是将现有窗口置于前台。如何防止这种行为?提前致谢。

【问题讨论】:

  • 请提供您的NSMeniItem-action。

标签: macos cocoa nswindow nsmenu


【解决方案1】:
  1. 选择目标窗口控制器
  2. 单击属性检查器并在 Presentation 下选择“Single”而不是“Multiple”

【讨论】:

  • 谢谢!我知道这很简单。
  • 有没有办法以编程方式实现?
  • 检查presentedViewControllers属性
  • 不使用segue怎么办?按下上下文菜单按钮后只需以编程方式初始化窗口
  • 这种情况意味着您自己进行内存管理->您知道是否之前创建过它。您的问题更像是如何使用 viewcontroller 创建窗口。
【解决方案2】:

如果您的 Window 没有使用 Storyboard,假设您为此 .xib 创建了单独的 .xib 和 ViewController,您可以使用以下方法:

加入你的班级:

lazy var testViewcontroller = TestViewController(nibName: "TestWindow", bundle: nil)
lazy var testWindow = NSWindow(contentViewController: testViewcontroller)

然后,将其添加到调用窗口的方法中:

testWindow.makeKeyAndOrderFront(nil)
NSApp.activate(ignoringOtherApps: true) // will help your window to open on top of others

【讨论】:

  • 不错的答案。为什么 NSApp.activate 是必要的? PS:该应用程序已经处于活动状态。
  • @MarekH 谢谢。如果您希望您的窗口在其他人之上打开而不是在其他人之后迷失 - 那么是的。就我而言,我只有 NSStatuItem 应用程序->当您单击它时,会出现一个 NSMenuItems 列表,然后通过单击特定的 MenuItem 窗口打开,我不希望该窗口在其他地方丢失(尤其是当这是一个小窗口。:)
  • 我可以确认菜单栏应用程序需要 NSApp.activate(ignoringOtherApps: true),因为它们具有不同的激活策略。但是,我认为这些命令应该重新排序。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2016-04-01
相关资源
最近更新 更多