我的变量值与prepareForSegue传输时的值不同?

时间:2016-12-17 22:36:55

标签: ios swift xcode xcode8

基本上,我的变量(playerErrors)通过按钮按钮更新,然后视图控制器通过数据传输被segued到下一个。但是,变量的值(例如,从0开始应该增加1)转移为0(就好像按钮没有被按下一样)。我的代码中有16个变量,我试图转移,但奇怪的是它们中的一半(8)可以工作,而那些工作的变量都是针对对手的值。不工作的8是玩家价值(如玩家错误)。

我是XCode的新手。我在高中上课,我们第一次学习编码,所以我还不太擅长,但我已经有好几天这个问题了。我解决不了!我已经在下方提供了我的视图控制器代码。

当触发youErrorDeep时,它会打印"从self 0到dvc:0"。

//
//  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.
    }
    */


}

2 个答案:

答案 0 :(得分:2)

它应该适用于这样的事情:

@IBAction func youErrorDeep(_ sender: Any){
    playerErrors += 1
    playerErrorsDeep += 1
    print("deep \(playerErrors), \(playerErrorsDeep)")
    self.performSegue(withIdentifier: "segueForYouErrorDeep", sender: self) //instead of "segueForYourErrorDeep" use the identifier for the correct segue
}

您必须为每个segue提供唯一标识符,但这样您仍然可以在一定程度上使用故事板。

这也确保了在操作之后执行segue。

如果您不确定如何为segue提供标识符,您只需单击segue图形,然后在属性下将标识符设置为任意字符串。

答案 1 :(得分:2)

您没有在代码中的任何位置调用peformSegueWithIdentifier:sender,因此我假设您直接从Interface Builder中的操作插座触发segue。

这在按钮按下时需要执行某些代码的地方不起作用,因为segue可能在执行@IBAction方法之前发生。

您应该从操作插座中删除segue,在Interface Builder中从View Controller对象创建一个segue,为此segue提供一个标识符,您可以使用@IBActionperformSegueWithIdentifier:sender方法启动它。

另外,为了便于阅读和维护,我强烈建议您创建一个类来存储播放器状态,然后您可以传递此类的实例而不是16个单独的变量