2015-06-22 83 views
2

我已经经历了很多questoions,但他们都没有snaswers我的查询。 我想以编程方式加载初始窗口 这是我所做的。如何从故事板加载初始窗口控制器?

我已经加入main.swift原样

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是 -

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我试图从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)  
    } 

} 
加载窗口控制器

但我无法启动初始窗口控制器和视图控制器。应用程序自动启动和终止,没有窗口显示给用户。

我做错了什么?谢谢你的帮助。

+0

你有什么成功的方法吗? – kroky

回答

0

这不是你如何启动(和维护)应用程序的主运行循环。请参阅@NSApplicationMain。这会导致主运行循环被设置并运行,直到终止。不再需要main.swift文件,因为您可以直接将其放入应用程序委托文件中。

import Cocoa 

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var window: NSWindow! 


    func applicationDidFinishLaunching(aNotification: NSNotification) { 
     // Insert code here to initialize your application 
    } 

} 

Xcode的新应用程序项目模板为您做到了这一点。

+1

感谢您的帮助。我只是想自己做所有这些事情来理解这个模板是如何工作的。我有意评论@NSApplicationMain。 – Abhishek

1

这是我以加载从最初的故事板窗口(以及MainMenu)编程无属性@NSApplicationMain和功能NSApplicationMain(_, _)

文件所做的: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(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应用程序模板,Application Scene包含Main Menu创建故事板。目前似乎没有办法从Application Scene以编程方式加载Main Menu。但有Xcode文件模板Main Menu,它创建了MainMenu.xib文件,我们可以通过编程加载。

相关问题