如何从情节提要中加载初始窗口控制器? [英] how to Load initial window controller from storyboard?
问题描述
我经历了很多问题,但是没有一个问题困扰我. 我正在尝试以编程方式加载初始窗口 这就是我所做的.
I have gone through many questoions but none of them snaswers my query. I am trying to load initial window programmatically Here is what I have done.
我已将main.swift添加为-
I have added main.swift as-
import Cocoa
private func runApplication(
application: NSApplication = NSApplication.sharedApplication(),
delegate: NSApplicationDelegate? = AppDelegate(),
bundle: NSBundle = NSBundle.mainBundle(),
nibName: String = "MainMenu",
var topLevelObjects: NSArray? = nil) {
setApplicationDelegate(application, delegate)
}
private func setApplicationDelegate(application: NSApplication, delegate: NSApplicationDelegate?) -> NSApplication {
if let delegate = delegate {
application.delegate = delegate
}
return application
}
runApplication()
Appdelegate.swift是-
Appdelegate.swift is-
import Cocoa
//@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var appControl:AppFlow?
func applicationDidFinishLaunching(aNotification: NSNotification) {
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
override init() {
//
self.appControl = AppFlow()
super.init()
}
}
在AppFlow中,我试图从情节提要中加载窗口控制器.-
And in AppFlow I am trying to load window controller from storyboard.-
import Cocoa
class AppFlow{
let initialStoryBoard:NSStoryboard?
override init() {
self.initialStoryBoard = NSStoryboard(name: "Main" , bundle : nil)
super.init()
var windowController = (self.initialStoryBoard?.instantiateControllerWithIdentifier("mainWindow")) as! NSWindowController
windowController.window?.makeKeyAndOrderFront(nil)
}
}
但是我无法启动初始窗口控制器和视图控制器.应用会自动启动和终止,不会向用户显示任何窗口.
But I am not able to launch initial window controller and view controller. App starts and terminates automatically, no window is presented to user.
我做错了什么?感谢您的帮助.
What I am doing wrong? Thanks for your help.
推荐答案
这是我为了以编程方式从情节提要(以及MainMenu
)加载初始窗口而没有属性@NSApplicationMain
和函数NSApplicationMain(_, _)
Here is what I did in order to load initial window from storyboard (as well as MainMenu
) programmatically without attribute @NSApplicationMain
and function NSApplicationMain(_, _)
文件: AppConfig.swift (Swift 4)
File: AppConfig.swift (Swift 4)
struct AppConfig {
static var applicationClass: NSApplication.Type {
guard let principalClassName = Bundle.main.infoDictionary?["NSPrincipalClass"] as? String else {
fatalError("Seems like `NSPrincipalClass` is missed in `Info.plist` file.")
}
guard let principalClass = NSClassFromString(principalClassName) as? NSApplication.Type else {
fatalError("Unable to create `NSApplication` class for `\(principalClassName)`")
}
return principalClass
}
static var mainStoryboard: NSStoryboard {
guard let mainStoryboardName = Bundle.main.infoDictionary?["NSMainStoryboardFile"] as? String else {
fatalError("Seems like `NSMainStoryboardFile` is missed in `Info.plist` file.")
}
let storyboard = NSStoryboard(name: NSStoryboard.Name(mainStoryboardName), bundle: Bundle.main)
return storyboard
}
static var mainMenu: NSNib {
guard let nib = NSNib(nibNamed: NSNib.Name("MainMenu"), bundle: Bundle.main) else {
fatalError("Resource `MainMenu.xib` is not found in the bundle `\(Bundle.main.bundlePath)`")
}
return nib
}
static var mainWindowController: NSWindowController {
guard let wc = mainStoryboard.instantiateInitialController() as? NSWindowController else {
fatalError("Initial controller is not `NSWindowController` in storyboard `\(mainStoryboard)`")
}
return wc
}
}
文件 main.swift (快速4)
// Making NSApplication instance from `NSPrincipalClass` defined in `Info.plist`
let app = AppConfig.applicationClass.shared
// Configuring application as a regular (appearing in Dock and possibly having UI)
app.setActivationPolicy(.regular)
// Loading application menu from `MainMenu.xib` file.
// This will also assign property `NSApplication.mainMenu`.
AppConfig.mainMenu.instantiate(withOwner: app, topLevelObjects: nil)
// Loading initial window controller from `NSMainStoryboardFile` defined in `Info.plist`.
// Initial window accessible via property NSWindowController.window
let windowController = AppConfig.mainWindowController
windowController.window?.makeKeyAndOrderFront(nil)
app.activate(ignoringOtherApps: true)
app.run()
关于MainMenu.xib
文件的注意事项:
Xcode应用程序模板使用包含Main Menu
的Application Scene
创建情节提要.目前,似乎无法以编程方式从Application Scene
加载Main Menu
.但是有Xcode文件模板Main Menu
,它创建了MainMenu.xib
文件,我们可以通过编程方式加载该文件.
Xcode application template creates storyboard with Application Scene
which contains Main Menu
. At the moment seems there is no way programmatically load Main Menu
from Application Scene
. But there is Xcode file template Main Menu
, which creates MainMenu.xib
file, which we can load programmatically.
这篇关于如何从情节提要中加载初始窗口控制器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!