2016-03-18 15 views
0

I ein Projekt mit drei unterschiedlichen Ansicht Controller haben:einen aktualisierten Variablenwert aus einer anderen Ansicht Controller Zugriff

Viewcontroller (dies ist, wo die Benutzereingaben-Werte), LoadingViewController (Ladebildschirm) und AnswerViewController (wo ich will die Ergebnis eines aktualisierten Wert in den ersten view-Controller geladen werden)

Hier ist der Code in Viewcontroller.

var calculatedRatio: Double? 

@IBOutlet weak var boysCountTextField: UITextField! 
@IBOutlet weak var girlsCountTextField: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func calculateButtonTapped(sender: UIButton) { 
    if boysCountTextField.text != "" && girlsCountTextField.text != "" { 
     calculateRatio() 
     self.performSegueWithIdentifier("loadingAnswer", sender: self) 
    } 
} 

func calculateRatio() { 

    let boysCount = Double(boysCountTextField.text!)! 
    let girlsCount = Double(girlsCountTextField.text!)! 

    let currentRatio = boysCount/girlsCount 

    calculatedRatio = currentRatio 
    print(calculatedRatio) 

} 

Wie Sie in diesem view-Controller sehen können ich eine Variable an der Spitze erstellt habe 01 genanntdas ist ein optionales Doppel. Und in der gleichen Ansicht Controller, sobald Sie auf eine Schaltfläche drücken, es führt eine Funktion auf der Unterseite namens calculateRatio(), die den calculatedRatio Wert aktualisiert.

Meine Frage ist, wie kann ich auf den neuen Wert dieser Variable in einem anderen Ansichtscontroller (AnswerViewController) zugreifen, in den ich nicht direkt segue?

Ich habe bereits versucht, innerhalb von AnswerViewController eine Instanz von ViewController zu erstellen, aber die Variable wird mit ihrem Anfangswert (der in diesem Fall gleich null ist) anstelle des neuen Werts der calculateRatio()-Funktion kopiert.

+0

Haben Sie versucht, Delegierung zu verwenden? – MikeG

Antwort

0

Sie möchten also einen Ladebildschirm anzeigen, der beim Bearbeiten einer komplexen Methode ein eigener View-Controller ist. Ich nehme an, es gibt einen Grund, warum Sie einen Ladebildschirm auf den Navigationsstapel werfen möchten, anstatt eine Art modales Overlay zu machen. Ich nehme auch an, dass es einen Grund gibt, warum die Berechnungen auf dem ersten View-Controller durchgeführt werden müssen (im Gegensatz zum Ladebildschirm) und es gibt keinen besseren Weg, die Berechnungen anderswo zu abstrahieren. Warum versuchst du nicht NSNotifications? Sie können darauf warten, dass die Berechnung im LoadingViewController beendet wird, und den Aktualisierungswert als Objekt übergeben.

+0

Wie würde ich das machen? –

+0

- (void) prepareForSegue: (UIStoryboardSegue *) von Segue Absender: (id) sender { if ([[segue Kennung] isEqualToString: @ "loadingAnswer"]) { LoadingViewController * destinationViewController = [segue destinationViewController]; destinationViewController. calculatedRatio = selbst.calculatedRatio } } –

+0

Überschreibung func prepareForSegue (segue: UIStoryboardSegue !, Absender: ANYOBJECT) { if (segue.identifier == "loadingAnswer") { lassen vc: LoadingViewController = segue .destinationViewController als LoadingViewController vc. calculatedRatio = selbst. calculatedRatio } } –

0

Sie können das Delegationsmuster der iOS-Anwendung verwenden. Hier versuche ich dein Problem zu lösen. Ich habe einige Änderungen an der Input ViewController-Klasse vorgenommen, um Delegate von AnswerViewController zu implementieren.

class ViewController: UIViewController,AnswerVCProtocol { 
    var calculatedRatio: Double? 

    @IBOutlet weak var boysCountTextField: UITextField! 
    @IBOutlet weak var girlsCountTextField: UITextField! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 

    @IBAction func calculateButtonTapped(sender: UIButton) { 
    if boysCountTextField.text != "" && girlsCountTextField.text != "" { 
     calculateRatio() 
     self.performSegueWithIdentifier("loadingAnswer", sender: self) 
    } 
    } 

    func calculateRatio() { 

    let boysCount = Double(boysCountTextField.text!)! 
    let girlsCount = Double(girlsCountTextField.text!)! 

    let currentRatio = boysCount/girlsCount 

    calculatedRatio = currentRatio 
    print(calculatedRatio) 

    } 

    // MARK: AnswerViewController Delegate 

    func getUpdateRadio()-> Double?{ 
    return self.calculatedRatio 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    // Please check you identifier as you given in storyboard 
    if segue.identifier == "loadingAnswer"{ 

     let ansVc = segue.destinationViewController as! AnswerViewController 

     ansVc.delegate = self 

    } 

    } 


} 

Hier ist das Protokoll

protocol AnswerVCProtocol{ 
    func getUpdateRadio()-> Double? 
} 

Jetzt denke ich Ihre AnswerViewController so etwas wie dieses. Hier zeige ich nur, wie Sie auf die Variable über Delegate zugreifen können.

class AnswerViewController: UIViewController { 

    var delegate: AnswerVCProtocol? 

    override func viewDidLoad() { 
    <#code#> 
    } 
    // To receive update value call this function when you needed 
    // Receive Update Value from your Input ViewController 
    func updateRadio(){ 
    if let _ = self.delegate{ 
    let updateRatio = delegate?.getUpdateRadio() 
    } 

    } 

} 

Übersicht

  1. Declare-Protokoll. In diesem Fall AnswerVCProtocol.

  2. Bestätigen Sie das Protokoll in Ihrem Input ViewController.

Verwandte Themen