2017-12-10 3 views
2

Ich bin ziemlich neu in die Programmierung mit Xcode/Swift an vorbei und ich bin ein kleines Problem.Delegieren ist immer null Info zwischen 2x ohne Viewcontrollers segue

Ich möchte Informationen von einem ViewController zu einem zweiten ViewController mit Delegate und ohne Überleitung senden. Ich habe viel darüber gelesen und festgestellt, dass die gängigste Lösung darin besteht, die "Instanz" .delegate = self in ViewDidLoad zu verwenden, aber das funktioniert einfach nicht für mich.

- Definition der App -

Es ist ziemlich einfach. Auf dem ersten ViewController habe ich eine Schaltfläche und ein Label. Die Schaltfläche öffnet den zweiten ViewController mit einem textField und einem Button. Der Button sendet, was im textField ist, an den ersten ViewController, um das Label zu aktualisieren.

- Code -

Dies ist der Code für den ersten Viewcontroller ist:

class ViewController: UIViewController, clickedButtonDelegate { 

    @IBOutlet weak var Label: UILabel! 

    func didClickedButton(text: String) { 
     Label.text = text 
    } 

    var secondView = SecondViewController() 

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

Dies ist der Code für den zweiten Viewcontroller:

protocol clickedButtonDelegate { 
    func didClickedButton(text: String) 
} 

class SecondViewController: UIViewController { 

    @IBOutlet weak var introducedText: UITextField! 

    var delegate : clickedButtonDelegate! 

    @IBAction func sendData(_ sender: Any) { 
     if delegate != nil { 
      let information:String = introducedText.text! 
      delegate!.didClickedButton(text: information) 
      dismiss(animated: true, completion: nil) 
      self.navigationController?.popViewController(animated: true) 
     } 
    } 
} 

diesen Code mit nichts passiert weil der Delegat in SecondViewController immer null ist.

Könnten Sie bitte helfen?

Vielen Dank im Voraus!

+3

Wann und wie drücken Sie SecondViewController? Könnten Sie bitte auch diesen Code zur Verfügung stellen? –

+0

Diese Zeile: 'var secondView = SecondViewController()' erstellt man eine Instanz von 'SecondViewController'. Sind Sie mit ** dieser ** Instanz verbunden? Oder Sie erreichen "SecondViewController" über Storyboard-Segmente?Wenn das der Fall ist, müssen Sie einen Zeiger auf ** diese ** Instanz erstellen und vermeiden 'var secondView = SecondViewController()' – Honey

+0

Siehe [diese Antwort] (https://stackoverflow.com/a/31934786/ 5175709) und das Video, das es mit – Honey

Antwort

0

eigentlich mein ursprünglicher Code ist complexe. Ich habe versucht, das Problem mit einer viel einfacheren Übung zu reduzieren, um besser zu verstehen, wie ich Informationen mit und ohne Segues weitergeben kann.

ich beide Viewcontrollers mit einem Segue anschließe (siehe Bild).

Layout

Bisher fand ich zwei Wege der Informationsweitergabe, die hier arbeiten:

  1. Segue: durch zwei Viewcontrollers mit einem Segue verbindet und bereiten verwenden (segue), wie folgendes Beispiel, und dann Protokollfunktionen verwenden:

    //This piece of code goes inside the first ViewController 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
        if segue.identifier == "showSecondView" { 
         let secondView: SecondViewController = segue.destination as! SecondViewController 
         secondView.delegate = self 
        } 
    } 
    
  2. Instanzierung: indem eine neue Instanz des ersten Viewcontroller zu schaffen und usin g die Informationen benötige ich von der zweiten View-Controller, wie im Beispielcode:

    //This piece of code goes inside the second ViewController 
    @IBAction func sendData(_ sender: Any) { 
        let text_to_pass = introducedText.text 
    
        let firstVC = storyboard?.instantiateViewController(withIdentifier: "GetData") as! ViewController 
        self.present(firstVC, animated: true) 
        firstVC.Label.text = text_to_pass 
    } 
    

Beide Optionen hier sind ok, aber ich möchte verstehen, warum der obige Code funktioniert nicht. Ich lese viele Artikel und die meisten Leute benutzen secondView.delegate = self innerhalb von ViewDidLoad und funktionieren wie Charme.

Was mache ich falsch?