How to pass data from NSWindowController to its NSViewController?

How about like this using delegate? This example will change your button's title.

@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
    }

}

To access NSViewController from NSWindowController:

let viewController:MainViewController = self.window!.contentViewController as! MainViewController

To access NSWindowController from NSViewController:

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

Tags:

Macos

Cocoa

Swift