2016-04-15 20 views
0

Ich habe ein Spiel, wo ich den Wert der Highscore eines Spielers als "highScore" speichern, in der ersten Ansicht Controller.Fehler beim Übertragen von Daten von Variable zwischen Storyboards

Was ich tun möchte, ist zu versuchen, diese variablen Daten auf den zweiten View-Controller zu übertragen.

Ich in den folgenden Code in der ersten Ansicht Controller Storyboard eingegeben.

Btw, highscore2 ist die Variable, die ich in den zweiten View-Controller delcared, die Daten aus den ersten Highscore-Variablen zu speichern .:

override func prepareForSegue(segue: UIStoryboardSegue!, sender:AnyObject!) 
{ 
      if (segue.identifier == "segueTest") 
      { 
       var svc = segue!.destinationViewController as! viewTwo; 

       svc.highScore2 = "High Score \(highScore)" 

      } 
} 

Hier ist der Code in meinen zweiten View-Controller (viewTwo):

class viewTwo: UIViewController 
{ 



    @IBOutlet var highScoretwolbl: UILabel! 

    var highScore2:String! 



    override func viewDidLoad() { 
      highScoretwolbl.text = highScore2 
    } 
} 

Aus irgendeinem Grund stellt der Code, aber die hohe Punktzahl nicht angezeigt wird, und ist „Null“.

+0

Welche Art von Überleitung verwenden Sie? show (push), show detail (ersetzen), modal präsentieren, popover? Wenn es "Show" ist, dann sollte es funktionieren! – D4ttatraya

+0

yeah, ich habe gezeigt – sdksmkfnajnf

Antwort

0

Wie in anderen Antworten angegeben, wird viewDidLoad nur einmal ausgelöst. Da Sie eine erzwungene unverpackte Zeichenfolge verwenden, ist es zunächst Null. Es (highScore2) wird keinen Wert erhalten, bis Sie es festlegen, was passiert nach viewDidLoad. Fügen Sie einige Druckanweisungen hinzu, damit Sie die Abfolge der Ereignisse sehen können.

Ihre beste Option ist die Verwendung von viewWillAppear. Dies wird jedes Mal ausgelöst Ihre Ansicht erscheint. Das ist, was du willst.

Sie müssen keine Force-Unwrapped-Variable verwenden. Machen Sie einfach eine Zeichenfolge machen Sie es zunächst leer.

override func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?) 
{ 
    if segue.identifier == "segueTest" 
    { 
     if let svc = segue.destinationViewController as? viewTwo { 
      print("setting score in prepareForSegue") 
      svc.highScore2 = "High Score \(highScore)" 
     } 
     else { 
      print("something bad happened") 
     } 
    } 
} 


class viewTwo: UIViewController 
{ 


    @IBOutlet var highScoretwolbl: UILabel! 

    // The following uses forced upwrapping which means it could be nil 
    // if you never set it and your app will crash. 
    // var highScore2: String! 
    // Instead, do this: 
    var highScore2: String = "" 

    override func viewWillAppear(animated: Bool) { 
     // putting this here will ensure that every time the screen 
     // is shown, the label will get set from the string. 
     highScoretwolbl.text = highScore2 
    } 
} 
+0

statt ViewWillAppear, hast du ViewDidLoad gemeint? Es besagt, dass es nicht übersteuern kann Funktion, weil es keine Funktion namens viewWillAppear zum Überschreiben gibt – sdksmkfnajnf

+0

Mein Fehler, ich habe vergessen, den Parameter der Funktion hinzuzufügen, aber aus irgendeinem Grund zeigt es mir immer noch ein leeres Textfeld – sdksmkfnajnf

+0

Dies ist der richtige Ansatz muss das debuggen.Fügen Sie print-Anweisungen hinzu, um zu sehen, welche Werte übergeben und empfangen werden. Hier ist ein einfaches Beispiel, das funktioniert: https://github.com/ryantxr/legendary-potato – ryantxr

0

Wenn ich mich richtig erinnere, wird die Methode viewDidLoad nur einmal aufgerufen, wenn der View-Controller zuerst initialisiert wird. Sie setzen also die highScoretwolbl Variable, bevor highScore2 tatsächlich irgendwelche Daten hat, deshalb ist es Null.

Ich würde empfehlen, den Text innerhalb viewWillAppear so zu setzen, dass es jedes Mal aktualisiert, wenn das Segment passiert.

So etwas wie

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(true) 
    highScoretwolbl.text = highScore2 
} 

Dies ist ein Verweis auf den Lebenszyklus aller Methoden eines View-Controller. View controller lifecycle

+0

Aus irgendeinem Grund zeigt es mir immer noch ein leeres Textfeld – sdksmkfnajnf

1

Vermeiden Sie das erzwungene Auspacken.

if let svc = segue.destinationViewController as? viewTwo{ 
    svc.highScore2 = "High Score \(highScore)" 
} 

Dann in einem Haltepunkt setzen und stellen Sie sicher, dass Sie alle diese Zeilen bekommen.

+0

Aus irgendeinem Grund funktioniert es immer noch nicht :( – sdksmkfnajnf

Verwandte Themen