2017-10-04 2 views
0

Zwei View-Controller an den Ausgang weitergeben müssen:Kommunikation zwischen View-Controller, nicht in der Lage auf den Daten des zweiten View-Controller

Two view controllers

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if (sender as! cell1).name.text == "ww"{ 
      let s = segue.destination as! DetailViewController 
      s.detail?.text = "wwwwwwwwwww" 
     } 
    } 

Ich bin neu in Codierung. Was ich hier versuche, ist zwischen den View-Controllern zu kommunizieren. Aus irgendeinem Grund kann ich die wwwwwwwwwww im Etikett des zweiten View-Controllers nicht anzeigen

Antwort

0

Bei der Vorbereitungsfunktion wurde die Ansicht noch nicht vom Storyboard geladen, daher sind die Ausgänge des DetailViewControllers immernoch null. Erstellen Sie eine öffentliche Variable im DetailViewController, die bei prepare verfügbar sein wird, und dann können Sie in der viewDidLoad-Methode von DetailViewController den Text der Beschriftung als den Inhalt dieser Variablen festlegen.

class DetailViewController: UIViewController { 

    var text: String? 

    override function viewDidLoad() { 
     super.viewDidLoad() 
     label.text = text 
    } 
} 

dann in Ihrer Liste Viewcontroller die Eigenschaft text Detaillierungsgrad vc gesetzt:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    guard (sender as! cell1).name.text == "ww", 
     let detailVc = segue.destination as? DetailViewController 
     else { return } 

    detailVc.text = "wwwwwwwwwww" 
} 
+0

Dank. Aber ist 'Detail' auch keine Eigenschaft von DetailViewController. Eine Steckdose zu sein, ist nur eine weitere Möglichkeit, sie zu aktualisieren. – jsr

+0

Ja, aber "Detail" -Eigenschaft ist ein Interface Builder Outlet, das bis zu den viewDidLoad-Methoden null ist (seit dieser Zeit wurde die Ansicht noch nicht geladen, also keine ihrer Ausgänge sind an den code noch gebunden), nach viewDidLoad kann man auf die detail -Eigenschaft zugreifen, die in deinem Fall ein UILabel darstellt, aber vorher nicht. Und da performSegue vor dem DetailsVc viewDidLoad stattfindet, können Sie zu diesem Zeitpunkt nicht auf das Label "detail" aus dem Code zugreifen. – danieltmbr

+0

Lebenszyklus eines UIViewController: https://stackoverflow.com/questions/5562938/looking-to-understand-the-ios-uiviewcontroller-lifecycle – danieltmbr

Verwandte Themen