2017-08-12 1 views
0

Ich versuche, Daten durch prepare (für segue) -Methode zu übergeben, aber ich kann nicht übergeben Daten in der ReceiverViewController. Ich frage mich, ob ich die ganze Instanz lieber weitergeben würde, ich weiß nicht, ob es möglich ist. Ich bin ein Neuling auf Swift und dies ist mein erster Versuch, wäre jeder Rat willkommen.Pass spezifischen Schlüssel/Wert mit Prepare-Segment zwischen mehreren Controllern

Die Klasse ich verwenden möchte, ist folgende - UserClass.swift:

class User { 
    var firstname: String 
    var lastname: String 
    var role: Int 

    init(firstname: String, lastname: String, role: Int) { 
     self.firstname = firstname 
     self.lastname = lastname 
     self.role = role 
    } 

} 

Methode auf FirstViewController.swift

vorbereiten Mein
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "loadBoard" { 
     if let dVC = segue.destination as? ReceiverViewController { 
      dVC.code?.firstname = anotherValue 

      //Following show me nil 
      print("Sent data \(dVC.code?.firstname)") 
     } 
    } 
} 

Hier ist, was ich versucht, die Daten zu erhalten - ReceiverViewController .swift:

var code: User? 

if let test = self.code?.firstname { 
    self.categoryLabel.text = code?.firstname 
    print(code) 
} else { 
    print("Something wrong") 
} 
+1

Sind Sie die 'code' Eigenschaft irgendwo im Code initialisiert? – Kymer

+0

Übergeben Sie die gesamte Instanz. Es sollte funktionieren. –

+0

Das Übergeben von Daten zwischen Controllern ist nicht schwierig, kann aber etwas verwirrend sein. [Dieses Beispiel] (https://github.com/ryantxr/legendary-potato) zeigt, wie es geht. – ryantxr

Antwort

1

prepareForSegue vor dem Ziel genannt viewControll ers AnsichtDidLoad. Wenn Sie darauf vertrauen, dass die code -Eigenschaft während ViewViewDidLoad von ReceiverViewController auf einen Benutzer gesetzt ist, funktioniert Ihre Methode nicht.

So müssen Sie entweder die Code-Eigenschaft von ReceiverViewController während PreparateForSegue festlegen oder eine andere Eigenschaft von ReceiverViewController mit dem Vornamen festlegen, dann erhalten Vorname Code während ViewDidLoad von ReceiverViewController zugewiesen.

0

In prepareForSegue versuchen Sie eine Eigenschaft auf code: User?, die ein nicht initialisiertes Objekt ist. Was können Sie stattdessen tun, ist ein initialisiert User Objekt in Ihren Anruf performSegue passieren und dann wie folgt vorgehen:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "loadBoard" { 
     if let dVC = segue.destination as? ReceiverViewController, 
      let user = sender as? User { 
       dVC.code = user 

     } 
    } 
} 
0

Dies ist ein Beispiel dafür, wie Daten zu senden und empfangen, die von einem Controller zum anderen.

prepareForSegue wird aufgerufen, bevor der Zielcontroller geladen wird. Aus diesem Grund können Elemente auf dem Zielcontroller nicht innerhalb des sendenden Controllers festgelegt werden. Der Ansatz hier ist, eine andere Variable mit den zu sendenden Daten zu setzen. Bearbeiten Sie im Zielansicht-Controller die Daten in viewWillAppear.

Der Sende Controller:

// https://github.com/ryantxr/legendary-potato 
// ViewController.swift 
// data-share 
// 
// Created by ryan teixeira on 3/21/16. 
// Copyright © 2016 Ryan Teixeira. All rights reserved. 
// 
import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var helloTextField: 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. 
    } 
    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
     if segue.identifier == "showDetail" { 
      print("detail segue") 
      let destinationController = segue.destinationViewController as! DetailViewController 
      destinationController.helloText = helloTextField.text 
     } 
    } 
} 

Der Empfangs-View-Controller:

// https://github.com/ryantxr/legendary-potato 
// DetailViewController.swift 
// data-share 
// 
// Created by ryan teixeira on 3/21/16. 
// Copyright © 2016 Ryan Teixeira. All rights reserved. 
// 
import UIKit 

class DetailViewController: UIViewController { 

    var helloText: String? 
    @IBOutlet weak var helloLabel: UILabel! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    override func viewWillAppear(animated: Bool) { 
     helloLabel.text = helloText 
    } 

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


    /* 
    // MARK: - Navigation 
    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 
Verwandte Themen