2015-03-07 12 views
8

ho un IBOutlet di un pulsante NSToolBar nel mio NSWindowController classe, che è la mia classe della finestra principale:Come passare i dati da NSWindowController al suo NSViewController?

class MainWindowController: NSWindowController { 

    @IBOutlet weak var myButton: NSButton! 

    // ... 
} 

ho una classe MainViewController che è che il contenuto NSViewController della finestra principale.

Come posso accedere a questo pulsante nel mio contenuto NSViewController? C'è un modo migliore per organizzare il IBOutlets e i controller per facilitare questo accesso?

+3

Si dovrebbe provare a creare un nuovo progetto e deselezionare "utilizzare storyboard". Ti renderà la vita 10 volte più facile –

+0

Crea un riferimento al tuo oggetto controller di finestra dal tuo controller di visualizzazione. Puoi accedere al tuo pulsante tramite il controller della finestra. –

+0

I pulsanti generalmente non appartengono ai controller della finestra. Se il tuo controller per finestre ha bisogno di rispondere ad alcune modifiche, questo può essere meglio disaccoppiato. – uchuugaka

risposta

6

Che ne dici di utilizzare questo delegato? Questo esempio cambierà il titolo del tuo pulsante.

@objc protocol SomeDelegate { 
    func changeTitle(title: String) 
} 

class ViewController: NSViewController { 

    weak var delegate: SomeDelegate? 

    @IBAction func myAction(sender: AnyObject) { 
     delegate?.changeTitle("NewTitle") 
    } 

} 

class MainWindowController: NSWindowController, SomeDelegate { 

    @IBOutlet weak var myButton: NSButton! 

    override func windowDidLoad() { 
     super.windowDidLoad() 

     // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. 
     let myVc = window!.contentViewController as! ViewController 
     myVc.delegate = self 

    } 

    func changeTitle(title: String) { 
     myButton.title = title 
    } 

} 
7

Per accedere NSViewController da NSWindowController:

let viewController:MainViewController = (self.window?.contentViewController)! as! MainViewController 

Per accedere NSWindowController da NSViewController:

let windowController:MainWindowController = self.view.window?.windowController as! MainWindowController 
+1

Non c'è motivo di concatenare condizionatamente se finirai per scartare la forza comunque. 'self.window! .contentViewController as! MainVC' – Alexander

+0

Quello era Swift v2.1 o qualcosa del genere. Molto più pulito in v3. –

+0

Il concatenamento opzionale non è cambiato da Swift v2.1 – Alexander

Problemi correlati