我有一个通过状态菜单中的扩展程序工作的应用程序。
我有一个“设置”按钮,用户点击该按钮时应启动我的故事板的特定视图。
我尝试了许多不同的方式,Open NSWindowController from NSMenu,Cocoa - 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/