如何从情节提要中加载初始窗口控制器? [英] how to Load initial window controller from storyboard?

查看:104
本文介绍了如何从情节提要中加载初始窗口控制器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我经历了很多问题,但是没有一个问题困扰我. 我正在尝试以编程方式加载初始窗口 这就是我所做的.

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 MenuApplication 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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆