2017-08-09 3 views
3

Ich habe versucht, den Wert der Zelle zu übergeben, auf die der Benutzer auf einen anderen View-Controller klickt.Wert vom Tabellenansicht-Controller übergeben, um den Controller anzuzeigen

Hier ist mein Code.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    productDisplayed = currentProductList[indexPath.row] as? Product 
    performSegue(withIdentifier: "ProductDetailSegue", sender: self) 
} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "AddProductSegue"){ 
     let controller: AddProductViewController = segue.destination as! AddProductViewController 
     controller.delegate = self 
    } 

    if (segue.identifier == "ProductDetailSegue"){ 

     let controller: ProductDetailsViewController = segue.destination as! ProductDetailsViewController 
     controller.currentProduct = productDisplayed 
    } 
} 

Erstens habe ich nicht "performSegue()" geschrieben. Das Problem, das ich traf, ist, dass der Bildschirm zuerst übertragen wird, anstatt den Wert "productDisplayed" zuzuweisen, was bedeutet, dass das Objekt "currentProduct" in der zweiten VC Null ist.

Dann habe ich "performSegue()" hinzugefügt. Es hat immer noch nicht funktioniert. Die Sache ist, der zweite Bildschirm wurde zweimal angezeigt. Das erste Mal ist dasselbe mit dem obigen Bild. Und das zweite Mal ist richtig.

Aber als ich versuchte, den Zurück-Knopf auf der linken oberen Seite zu klicken. Es wurde auf die nil-Seite statt auf die ProductDetail-Seite zurückgesetzt. Der Screenshot ist wie folgt.

enter image description here

enter image description here

Es scheint, wie "Prepare" wird immer zuerst genannt wird, die Tableview dann. Wie ändere ich die Bestellung? Wenn kann, sollte dies behoben werden, denke ich.

Ich hoffe, Ihre Hilfe zu bekommen. Danke.

Antwort

1

Ursache des Problems:
In Ihrem Storyboard, Sie haben können, ProductDetailsViewController mit UITableViewCell direkt gebunden.

Es bedeutet, nach dem Klicken/Auswahl der Zeile, wird es direkt segue (Navigation) durchführen.

Zur gleichen Zeit, Sie programmatisch Navigationsoperation durchführen performSegue(withIdentifier: "ProductDetailSegue", sender: self)

Lösung mit:
Sie haben zwei Möglichkeiten, dieses Problem zu lösen.

  1. Ich empfehle - In Ihrem Storyboard, schalten segue Verbindung UITableViewCell-UIViewController (Entfernen segue Verbindung von UITableViewCell und befestigen Sie die gleiche segue Verbindung mit UIViewController Ihrer Tableview)
  2. In Ihrem Quellcode, löschen/entfernen diese Linie performSegue(withIdentifier: "ProductDetailSegue", sender: self) und handhaben Datenübertragung von dieser Funktion override func prepare(for segue: UIStoryboardSegue, sender: Any?)
+0

Ich versuchte, das "performSegue()" zu entfernen. Aber das übertragene Objekt war damals null. Es scheint, als ob der Wert nicht ProductDisplayed zugewiesen wurde. –

+0

Wow! Dein erster Weg funktioniert! Vielen Dank. Aber ich bin immer noch verwirrt darüber, wie man es auf deine zweite Art schafft. –

+0

Kühl. Die Antwort wird akzeptiert. Würdest du bitte erklären, warum der zweite Weg nicht funktioniert? –

Verwandte Themen