2015-03-07 11 views
8

Mam IBOutlet z przycisku NSToolBar w moim NSWindowController klasy, która jest moim głównym klasy okna:Jak przekazać dane z NSWindowController do swojego NSViewController?

class MainWindowController: NSWindowController { 

    @IBOutlet weak var myButton: NSButton! 

    // ... 
} 

Mam klasy MainViewController że jest to, że zawartość NSViewController głównego okna.

Jak mogę uzyskać dostęp do tego przycisku w mojej treści NSViewController? Czy istnieje lepszy sposób zorganizowania IBOutlets i kontrolerów, aby ułatwić dostęp?

+3

Należy starać tworzenia nowego projektu i odznacz "użyj storyboardy". Ułatwi to twoje życie 10 razy –

+0

Odwołaj się do obiektu kontrolera okiennego z kontrolera widoku. Możesz uzyskać dostęp do przycisku poprzez kontroler okien. –

+0

Przyciski zazwyczaj nie należą do kontrolerów okien. Jeśli kontroler okien musi reagować na pewne zmiany, można to lepiej rozdzielić. – uchuugaka

Odpowiedz

6

Co powiesz na to, używając delegata? Ten przykład zmieni tytuł Twojego przycisku.

@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

Aby uzyskać dostęp NSViewController z NSWindowController:

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

Aby uzyskać dostęp NSWindowController z NSViewController:

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

Nie ma sensu, jeśli chodzi o łączenie warunkowe, jeśli mimo wszystko masz zamiar rozpakować siły. 'self.window! .contentViewController as! MainVC' – Alexander

+0

To był Swift v2.1 lub coś podobnego. Znacznie czystsze w v3. –

+0

Opcjonalne połączenie nie zmieniło się od czasu Swift v2.1 – Alexander

Powiązane problemy