2014-06-16 16 views
5

Il mio attuale codice Swift diCome istanziare NSViewController in Swift?

  var appBundle = NSBundle.mainBundle() 
     let controller: ViewController = ViewController.init(nibName:  "ViewController", bundle: nil) 
    self.window.contentView.addSubview(controller.view) 
    controller.view.frame = self.window.contentView.bounds 

sta ottenendo due errori. Uno è "Nome membro previsto o chiamata costruttore dopo il nome tipo" e l'altro è "() non è convertibile in" ViewController ".Per riferimento, ViewController è una classe che eredita da NSViewController

Entrambi gli errori si verificano ... sulla seconda riga di codice Grazie in anticipo

risposta

7

a swift non si chiama init sulle classi per creare un'istanza di loro si tralascia l'init e appena messo gli argomenti a destra dopo il nome del tipo:

let controller = ViewController(nibName: "ViewController", bundle: NSBundle.mainBundle()) 

oppure, non è necessario fornire lo nibName se corrisponde al na me della classe:

let controller = ViewController() 
+2

e si deve passare NSBundle.mainBundle () come pacchetto. La documentazione dice che nil è ok, ma si ottiene un messaggio di errore se si tenta di passare nil come bundle. – juniperi

+0

grazie @juniperi – drewag

+1

@juniperi mi hai appena salvato molte più ore di frustrazione. Stavo cercando di istanziare un NSViewController che passava nil per il bundle e ho continuato a ricevere "Impossibile trovare un overload per '__conversion' che accetta gli argomenti forniti". Passando NSBundle.mainBundle() corregge questo. Grazie – mike

0

ho dovuto fare l'inizializzazione del controller della vista una costante globale, al fine di farlo funzionare in tutta la mia app. Dopo la svinatura il mio cervello, ho scoperto che stava lavorando a livello locale, in modo che lo rende globale (mettendolo fuori della classe AppDelegate. Funziona per me senza l'errore "nullo")

//global constant 
let viewController = ViewController(nibName: "ViewController", bundle: NSBundle.mainBundle()) 

class AppDelegate: NSObject, NSApplicationDelegate { 
    @IBOutlet var window: NSWindow 

func applicationDidFinishLaunching(aNotification: NSNotification?) { 

    //links and loads the view to the main window 
    self.window.contentView.addSubview(viewController.view) 
    viewController.view.frame = self.window.contentView.bounds 

    //works locally and elsewhere as long as viewController is global! 
    viewController.statusField.stringValue = "TESTING" 
    println(viewController.statusField) 

    } 
} 
+0

Anche bundle: nil funziona anche con la costante viewController è globale. I documenti di Apple non sono errati. Questo è comunque il 10.9. nil carica il mainBundle in base ai documenti. e lascia che controller = ViewController() anche con esso come globale con lo stesso nome di classe. Ho provato tutti e tre. – Goodtime

Problemi correlati