我有一个通过状态菜单中的扩展程序工作的应用程序。

我有一个“设置”按钮,用户点击该按钮时应启动我的故事板的特定视图。

我尝试了许多不同的方式,Open NSWindowController from NSMenuCocoa - How to bring particular window to come in foreground from StatusMenu

这是我当前的代码:

StatusMenu.swift

func showSettings() {

  var mainWindowController = MainWindowController()
  mainWindowController.showWindow(nil)

}

MainWindowController.swift

class MainWindowController: NSWindowController {

 override func windowDidLoad() {
   super.windowDidLoad()

   self.window?.center()
   self.window?.makeKeyAndOrderFront(nil)
   NSApp.activate(ignoringOtherApps: true)

   }

}

最佳答案

发布的代码有2个潜在问题:


MainWindowController.init不是由NSWindowController实现的,而是由NSObject实现的,这意味着与NSViewControllers不同,这不会查找同名的Nib文件。用这个:

extension MainWindowController {
    convenience init() {
        self.init(windowNibName: .init(rawValue: "MainWindowController"))
    }
}

mainWindowController引用了生成的实例,但是此变量仅具有showSettings()的本地范围。这意味着showSettings()完成后,垃圾收集器将再次释放该对象。就像从未存储过一样好。您需要在存在或作为全局变量的对象中保留永久引用,如下所示:

 // Assuming your StatusMenu instance is strongly referenced for the whole runtime
 class StatusMenu {
     var mainWindowController: MainWindowController?
     func showSettings() {
        self.mainWindowController = MainWindowController()
        self.mainWindowController?.showWindow(nil)
     }
 }

关于ios - 从StatusMenu显示NSWindowController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47755471/

10-11 11:42