2016-03-29 10 views
1
vorherigen Viewcontroller zurück zu senden

Ich habe 2 Viewcontrollers wie folgt aus:Wie Rückruf verwenden, um Daten zu

enter image description here

ich will, wenn ich Taste in Viewcontroller drücken wird ViewController2 präsentieren. Wenn ich dann den Text in TextField eingib und die Taste Zurück in ViewController2 drücke, wird dieser Text in ViewController1 an die Schaltfläche gesendet.

Ich kann dies mit Delegaten lösen oder Verweis auf die Klasse ViewController in ViewController2. (Sie können mit meinem Kommentar-Code sehen)

Aber jetzt möchte ich CallBack verwenden, um Daten zurückzusenden.

Wie dies zu tun:

Hier ist Viewcontroller:

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet var button: UIButton! 
    var myString = "" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewWillAppear(animated: Bool) { 
     button.setTitle(myString, forState: .Normal) 
    } 
    @IBAction func goToViewController2(sender: AnyObject) { 
     let vc2 = storyboard?.instantiateViewControllerWithIdentifier("ViewController2") as! ViewController2 
//  vc2.vc1 = self 
     presentViewController(vc2, animated: true, completion: nil) 
    } 
} 

Und ViewController2:

import UIKit 

class ViewController2: UIViewController, UITextFieldDelegate { 

    @IBOutlet var textField: UITextField! 
// var vc1: ViewController? 
    var callback: ((String) -> Void)? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     textField.delegate = self 
    } 

    func textFieldDidEndEditing(textField: UITextField) { 
     callback!(textField.text!) 
    } 

    @IBAction func backToViewController(sender: AnyObject) { 
//  vc1?.myString = textField.text! 
     dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

Und ich will nicht mit Abschluss-Block verwenden Funktion entlassen, ich möchte nur meine eigene Rückrufmethode verwenden.

Antwort

1

In vc1, setzen vc2 ‚s Callback-Eigenschaft, bevor es vor:

@IBAction func goToViewController2(sender: AnyObject) { 
    let vc2 = storyboard?.instantiateViewControllerWithIdentifier("ViewController2") as! ViewController2 
    vc2.callback = { <Put your callback code here...> } 
    presentViewController(vc2, animated: true, completion: nil) 
} 

Und dann, in vc2 Aufruf der Callback-Funktion, bevor Sie den View-Controller abgewiesen:

@IBAction func backToViewController(sender: AnyObject) { 
    callback?(textfield.text!) 
    dismissViewControllerAnimated(true, completion: nil) 
} 
+0

Nizza, vc2.callback = ({string in self.myString = string }) Danke. – Khuong

Verwandte Themen