2015-06-22 84 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文件,我們可以通過編程加載。

相關問題