// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import Foundation import AppKit import FlutterMacOS /** The code behind a storyboard view which splits a flutter view and a macOS view. */ class MainViewController: NSViewController, NativeViewControllerDelegate { static let emptyString: String = "" static let ping: String = "ping" static let channel: String = "increment" var nativeViewController: NativeViewController? var flutterViewController: FlutterViewController? var messageChannel: FlutterBasicMessageChannel? override func viewDidLoad() { super.viewDidLoad() } override func prepare(for segue: NSStoryboardSegue, sender: Any?) { if segue.identifier == "NativeViewControllerSegue" { self.nativeViewController = segue.destinationController as? NativeViewController // Since`MainViewController` owns the platform channel, but not the // UI elements that trigger an action, those UI elements need a reference // to this controller to send messages on the platform channel. self.nativeViewController?.delegate = self } if segue.identifier == "FlutterViewControllerSegue" { self.flutterViewController = segue.destinationController as? FlutterViewController RegisterMethodChannel(registry: self.flutterViewController!) weak var weakSelf = self messageChannel?.setMessageHandler({ (message, reply) in // Dispatch an event, incrementing the counter in this case, when *any* // message is received. // Depending on the order of initialization, the nativeViewController // might not be initialized until this point. weakSelf?.nativeViewController?.didReceiveIncrement() reply(MainViewController.emptyString) }) } } func RegisterMethodChannel(registry: FlutterPluginRegistry) { let registrar = registry.registrar(forPlugin: "") messageChannel = FlutterBasicMessageChannel( name: MainViewController.channel, binaryMessenger: registrar.messenger, codec: FlutterStringCodec.sharedInstance()) } // Call in any instance where `ping` is to be sent through the `increment` // channel. func didTapIncrementButton() { self.messageChannel?.sendMessage(MainViewController.ping) } }