2016-12-17 3 views
2

Im Wesentlichen versuche ich 16 verschiedene Variablen zu erhalten, die von einem View-Controller an den anderen übergeben werden, aber nur die unteren 8 Gegnervariablen werden übergeben. Ich bin mir nicht sicher, was ich falsch mache oder warum nur die 8 (die "Gegner" gemeinsam haben) bestanden werden. Ich bin neu bei XCode, also ist alles, was mir helfen kann, großartig. Die Druckzeilen testeten, ob die Variablen gesendet wurden, wobei die erste nicht funktionierte und die zweite wie vorgesehen funktionierte.Ich versuche, Daten zwischen View-Controllern zu übergeben, aber nur die Hälfte meiner 16 Variablen bestehen?

// 
// ThirdViewController.swift 
// rally 
// 
// Created by GBernero on 12/6/16. 
// Copyright © 2016 GBernero. All rights reserved. 
// 

import UIKit 

class ThirdViewController: UIViewController { 

    @IBOutlet weak var emptyTennisCourt: UIImageView! 
    @IBOutlet weak var labelOpponent: UILabel! 
    @IBOutlet weak var labelPlayer: UILabel! 

    var playerWinners = 0 //holds total amount of winners player has hit 
    var playerShortWinners = 0 //holds amount of winners play has hit short 
    var playerDeepWinners = 0 //holds amount of winners play has hit deep 
    var playerErrors = 0 //holds total amount of errors play has hit 
    var playerErrorsLeft = 0 //holds amount of errors play has hit left 
    var playerErrorsRight = 0 //holds amount of errors play has hit right 
    var playerErrorsDeep = 0 //holds amount of errors play has hit deep 
    var playerErrorsNet = 0 //holds amount of errors play has hit in the net 
    var opponentWinners = 0 //holds total amount of winners opponent has hit 
    var opponentShortWinners = 0 //holds amount of winners opponent has hit short 
    var opponentDeepWinners = 0 //holds amount of winners opponent has hit deep 
    var opponentErrors = 0 //holds total amount of errors opponent has hit 
    var opponentErrorsLeft = 0 //holds amount of errors opponent has hit left 
    var opponentErrorsRight = 0 //holds amount of errors opponent has hit right 
    var opponentErrorsDeep = 0 //holds amount of errors opponent has hit deep 
    var opponentErrorsNet = 0 //holds amount of errors opponent has hit in the net 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
     let dvc = segue.destination as! SixthViewController 
     dvc.playerErrorsDeep = self.playerErrorsDeep 
     print("segueing from self \(self.playerErrorsDeep) to dvc: \(dvc.playerErrorsDeep)") 
     dvc.playerErrorsNet = self.playerErrorsNet 
     dvc.playerErrorsLeft = self.playerErrorsLeft 
     dvc.playerErrorsRight = self.playerErrorsRight 
     dvc.playerErrors = self.playerErrors 
     dvc.playerShortWinners = self.playerShortWinners 
     dvc.playerDeepWinners = self.playerDeepWinners 
     dvc.playerWinners = self.playerWinners 
     dvc.opponentErrorsDeep = self.opponentErrorsDeep 
     print("segueing to dvc2: \(dvc.opponentErrorsDeep)") 
     dvc.opponentErrorsNet = self.opponentErrorsNet 
     dvc.opponentErrorsLeft = self.opponentErrorsLeft 
     dvc.opponentErrorsRight = self.opponentErrorsRight 
     dvc.opponentErrors = self.opponentErrors 
     dvc.opponentShortWinners = self.opponentShortWinners 
     dvc.opponentDeepWinners = self.opponentDeepWinners 
     dvc.opponentWinners = self.opponentWinners 

    } 

    override func viewDidLoad() 
    { 
     self.navigationItem.setHidesBackButton(true, animated: false) //removes back button from access by user 

     self.view.backgroundColor = UIColor(patternImage: UIImage(named: "tennis_background.jpg")!) //sets background of view controller to the background image 


     super.viewDidLoad() 
    } 

    @IBAction func youErrorDeep(_ sender: Any) 
    { 
     playerErrors += 1 
     playerErrorsDeep += 1 
     print("deep \(playerErrors), \(playerErrorsDeep)") 
    } 
    @IBAction func youErrorLeft(_ sender: Any) 
    { 
     playerErrors += 1 
     playerErrorsLeft += 1 
    } 

    @IBAction func youErrorRight(_ sender: Any) 
    { 
     playerErrors += 1 
     playerErrorsRight += 1 
    } 

    @IBAction func youWinnerDeep(_ sender: Any) 
    { 
     playerWinners += 1 
     playerDeepWinners += 1 
    } 

    @IBAction func youWinnerShort(_ sender: Any) 
    { 
     playerWinners += 1 
     playerShortWinners += 1 
    } 

    @IBAction func youErrorNet(_ sender: Any) 
    { 
     playerErrors += 1 
     playerErrorsNet += 1 
    } 

    @IBAction func opponentErrorDeep(_ sender: Any) 
    { 
     opponentErrors += 1 
     opponentErrorsDeep += 1 
     print("it happens") 
    } 

    @IBAction func opponentErrorLeft(_ sender: Any) 
    { 
     opponentErrors += 1 
     opponentErrorsLeft += 1 
    } 

    @IBAction func opponentErrorRight(_ sender: Any) 
    { 
     opponentErrors += 1 
     opponentErrorsRight += 1 
    } 

    @IBAction func opponentWinnerDeep(_ sender: Any) 
    { 
     opponentWinners += 1 
     opponentDeepWinners += 1 
    } 

    @IBAction func opponentWinnerShort(_ sender: Any) 
    { 
     opponentWinners += 1 
     opponentShortWinners += 1 
    } 

    @IBAction func opponentErrorNet(_ sender: Any) 
    { 
     opponentErrors += 1 
     opponentErrorsNet += 1 
    } 




    /* 
    // MARK: - Navigation 

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


} 
+0

Bevor Sie sich Gedanken über 'dvc.playerErrorsDeep' machen, haben Sie sich' self.playerErrorsDeep' angesehen? War das, was du dachtest, dass es sein sollte? Wenn nicht, setze einen Haltepunkt, an dem du _that_ festlegst und stelle sicher, dass (a) es richtig eingestellt wird; und (b) es wird nicht irgendwo versehentlich zurückgesetzt. – Rob

+0

Wenn Sie nicht sicher sind, wo diese Variable sich ändert, kann ein Xcode "watch" sehr nützlich sein: http://Stackoverflow.com/a/41196124/1271826 – Rob

+0

Ich habe festgestellt, dass der self.playerErrorsDeep ordnungsgemäß aktualisiert wird auf der ersten View-Controller, aber es scheint ein Problem bei der Übertragung auf die zweite Ansicht Controller, dass die Variable gibt nicht diesen Wert und sitzt für immer bei 0. –

Antwort

2

Sie haben eine Tonne Code geschrieben und uns sagen, dass, wenn Sie ersetzt die print Erklärung mit:

print("segueing from self \(self.playerErrorsDeep) to dvc: \(dvc.playerErrorsDeep)") 

... dass es dann angezeigt: von

segueing Selbst 0 bis DVC: 0

So erscheint das Problem nur, dass playerErrorsDeep ist 0 bis zu der Zeit prepareForSegue heißt. Das Problem ist also nicht "Warum wird der Wert dvc nicht festgelegt?" sondern "warum ist playerErrorsDeep0?"

Lassen Sie mich diese Frage stellen: Ist das Steuerelement, das yourErrorDeep anruft, auch ein Segment daran angeschlossen? Wenn Sie beide haben und @IBAction (oder mehrere @IBAction), haben Sie keine Zusicherungen der Reihenfolge, die sie genannt werden.

Anstelle eines Steuerelements, das sowohl @IBAction als auch segue enthält, sollten Sie das Segment von der Schaltfläche entfernen und das Programm @IBAction programmgesteuert aufrufen, nachdem der Wert aktualisiert wurde. So sollten Sie:

  • Entfernen Sie den Übergang zwischen der Schaltfläche und der nächsten Szene;

  • Stattdessen fügen Sie die segue zwischen den View-Controller, sich durch Steuer aus dem View-Controller-Symbol über der "dritte" Szene auf die "sechsten" Szene -dragging:

    segue

  • Haben

    identifier

  • :

    es wählen, dass segue und geben eine Kennung Ihre @IBAction tun, was Aktualisierungen, die Sie möchten, und führen Sie dann programmatisch die segue:

    @IBAction func youErrorDeep(_ sender: Any) { 
        playerErrors += 1 
        playerErrorsDeep += 1 
        print("deep \(playerErrors), \(playerErrorsDeep)") 
    
        performSegue(withIdentifier: "GoToSixth", sender: self) 
    } 
    

Dadurch wird sichergestellt, dass die @IBAction zuerst durchgeführt wird, und dann wird es programmatisch die segue in die nächste Szene aufzurufen. Zu diesem Zeitpunkt hat playerErrorsDeep den Wert, den Sie erwartet haben.

Verwandte Themen