title: Swift sending data from child view to parent view controller
body: <p>I am developing an app where I have a view controller and subview. On the subview I am loading Google maps and on the main view I have a label.</p>
  
  <p>My question is how can I pass data from the subview (map geo location) to the label on the main view and have this updated as the location is updated using Swift.</p>
  
  <p>All the tutorials I have found use prepareForSegue where I would like to just update the label automatically as it is on the main view.</p>
  
  <p>Thanks</p>
  
  <p>Updated: I can't seem to get the delegate method to work. Code below.</p>
  
  <p>MapChildController.swift</p>
  
  <pre><code>import UIKit
  
  protocol ChildViewControllerDelegate{
      func delegateMethod(childViewController:MapChildController, text:String)
  }
  
  class MapChildController: UIViewController, CLLocationManagerDelegate {
  
  @IBOutlet weak var mapView: GMSMapView!
  let locationManager = CLLocationManager()
  var didFindMyLocation = false
  var myLocations: [CLLocation] = []
  
  var delegate:ChildViewControllerDelegate?
  
  override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
  
      var camera = GMSCameraPosition.cameraWithLatitude(-33.86, longitude: 151.20, zoom: 15, bearing: 0, viewingAngle: 45)
      var mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
  
      mapView.myLocationEnabled = true
      self.view = mapView
  
      locationManager.delegate = self
      locationManager.distanceFilter = kCLDistanceFilterNone
      locationManager.desiredAccuracy = kCLLocationAccuracyBest
  
      if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
          println("iOS &gt;= 8.0.0")
          locationManager.requestWhenInUseAuthorization()
          //locationManager.requestAlwaysAuthorization()
      }
  
      mapView.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.New, context: nil)
  
      locationManager.startUpdatingLocation()
      //locationManager.startMonitoringSignificantLocationChanges()
  }
  
  override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
  }
  
  override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer&lt;Void&gt;) {
      if !didFindMyLocation {
          let myLocation: CLLocation = change[NSKeyValueChangeNewKey] as! CLLocation
          var mapView = self.view as! GMSMapView
          mapView.camera = GMSCameraPosition.cameraWithTarget(myLocation.coordinate, zoom: 15.0)
          mapView.settings.myLocationButton = true
          didFindMyLocation = true
      }
  }
  
  func locationManager(manager:CLLocationManager, didUpdateLocations locations:[AnyObject]) {
  
      // println("Last location: \(locations.last)")
      self.delegate?.delegateMethod(self, text: "from child")
  }
  }
  </code></pre>
  
  <p>MapController.swift</p>
  
  <pre><code>import Foundation
  import UIKit
  
  class MapController : UIViewController, ChildViewControllerDelegate
  {
  @IBOutlet weak var Label: UILabel!
  var LabelText = String()
  
  override func viewDidLoad() {
      super.viewDidLoad()
  }
  
  override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
  }
  
  func delegateMethod(controller: MapChildController, text: String) {
      println("The text is " +  text);
  }
  }
  </code></pre>