2015-05-25 4 views
5

Я разрабатываю приложение, в котором у меня есть контроллер представления и под просмотр. В подзоне я загружаю карты Google, и на главном экране у меня есть ярлык.Быстрая отправка данных из дочернего представления в контроллер родительского представления

Мой вопрос в том, как передать данные из подсмотра (географическое местоположение карты) на метку на главном экране и обновить его, поскольку местоположение обновляется с помощью Swift.

Все обучающие программы, которые я нашел, используют prepareForSegue, где я хотел бы просто обновить ярлык автоматически, как на главном экране.

Благодаря

Обновлено: Я не могу получить метод делегата работать. Код ниже.

MapChildController.swift

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 >= 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<Void>) { 
    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") 
} 
} 

MapController.swift

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); 
} 
} 
+2

заголовок и текст дону 't матч. У вас есть подкласс с Google Maps или это другой контроллер? Если последний, добавили ли вы его в качестве контроллера детского представления вашего основного контроллера? – rdelmar

+0

Спасибо. Я обновил название. Я хочу отправить географические местоположения из дочернего представления (который имеет карту Google) в родительский вид (который имеет метку). – puks1978

+0

Используйте делегацию. Создайте главный контроллер представления, делегат представления и получите метод вызова вида (определенный в протоколе делегата) в своем делегате, когда это необходимо. – rdelmar

ответ

4

Делегирование модель является вашим другом.

Объявите протокол на контроллере дочернего представления, который будет реализован контроллером родительского представления. Всякий раз, когда вы хотите, вызовите метод по ссылке делегата, который вы держите в контроллере дочернего представления, - это обновит родительский контроллер представления данными из дочернего VC.

Этот SO вопрос объясняет ребенку родительскую делегацию аккуратно How do I set up a simple delegate to communicate between two view controllers?

0
var delegate:ChildViewControllerDelegate? 

В дополнение к этому, вы также должны сделать это, чтобы сделать делегат работы:

delegate = MapController() 
3

Я вижу некоторые ответы здесь , так что вы можете решить свою проблему, изменив некоторые строки в вашем коде, посмотрите:

protocol ChildViewControllerDelegate{ 
    func delegateMethod(childViewController:MapChildController, text:String) 
} 

Я использовал без childViewController прохождение по методу, тогда вы могли просто передать все, что хотите, отправить другому представлению, просто указав, какой тип данных вы хотите отправить, в случае, если это строка. Таким образом, вы можете изменить ChildViewControllerDelegate к:

protocol ChildViewControllerDelegate{ 
    func delegateMethod(text:String) 
} 

Вы должны сделать то же самое в классе MapController:

func delegateMethod(text: String) { 
    println("The text is " + text); 
} 

Вы можете увидеть лучшее объяснение в: How to send data back by popViewControllerAnimated for Swift

Смежные вопросы

 Смежные вопросы