Swift : 使用 prepareforsegue 函数时只传递特定变量

Swift : Only transfers certain variable when using prepareforsegue function

我正在使用 prepareforsegue 函数在视图控制器之间传输数据。我正在尝试传输由 5 个变量保存的数据,但只传输了 4 个。我想知道这是否是一个格式问题,考虑到正确传输的 4 个变量类型与另一个不同。任何帮助将不胜感激。谢谢你的时间。

发送者视图控制器

import Foundation
import UIKit

    class CratesViewController : UIViewController {

    var unlockedAK47 = "false"
    var unlockedDesertEagle = "false"
    var unlockedGlock17 = "false"
    var unlockedGlock18 = "false"

    var coinsAmount = 0
    let screenSize: CGRect = UIScreen.main.bounds

    @IBOutlet weak var coins: UILabel!
    @IBOutlet weak var cratesImageView: UIImageView!
    @IBOutlet weak var unlockView: UIView!
    @IBOutlet weak var backButtonOutlet: UIButton!
    @IBOutlet weak var gunImageView: UIImageView!

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        coins.text = String(coinsAmount)
        gunImageView.isHidden = true

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "cratesToMainSegue" {

            let destViewController = segue.destination as! ViewController

            destViewController.unlockedAK47 = unlockedAK47
            destViewController.unlockedDesertEagle = unlockedDesertEagle
            destViewController.unlockedGlock17 = unlockedGlock17
            destViewController.unlockedGlock18 = unlockedGlock18
            destViewController.coinsAmount = coinsAmount

        }

    }

}

目标视图控制器

import UIKit

class ViewController: UIViewController {

    var unlockedAK47 = "false"
    var unlockedDesertEagle = "false"
    var unlockedGlock17 = "true"
    var unlockedGlock18 = "false"

    struct defaultsKeys {
        static let keyOne = ""
    }

    var coinsAmount = 100

    @IBOutlet weak var coinsAmountLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Getting

        let defaults = UserDefaults.standard
        if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) {
            coinsAmount = Int(stringOne)!
        }

        coinsAmountLabel.text = String(coinsAmount)

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // Note that the segue identifiers have been set in the interface builder

        if segue.identifier == "cratesSegue" {

            let destViewController = segue.destination as! CratesViewController

            destViewController.coinsAmount = coinsAmount

            destViewController.unlockedAK47 = unlockedAK47
            destViewController.unlockedDesertEagle = unlockedDesertEagle
            destViewController.unlockedGlock17 = unlockedGlock17
            destViewController.unlockedGlock18 = unlockedGlock18

        } else if segue.identifier == "collectionSegue" {

            let destViewController = segue.destination as! CollectionViewController

            destViewController.coinsAmount = coinsAmount

            destViewController.unlockedAK47 = unlockedAK47
            destViewController.unlockedDesertEagle = unlockedDesertEagle
            destViewController.unlockedGlock17 = unlockedGlock17
            destViewController.unlockedGlock18 = unlockedGlock18

        }

    }

    @IBAction func saveButton(_ sender: Any) {

        coinsAmount = coinsAmount + 10
        coinsAmountLabel.text = String(coinsAmount)

        // Saving

        let defaults = UserDefaults.standard
        defaults.set(String(coinsAmount), forKey: defaultsKeys.keyOne)

    }

}

如果需要更多信息,请告诉我。 :)

这不是因为 coinsAmount 是不同的类型。这是因为 coinsAmount 的值在 viewDidLoad:

中被覆盖了
let defaults = UserDefaults.standard
if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) {
    coinsAmount = Int(stringOne)! <<<< HERE!
}

我认为你想要做的是仅在未传递给 ViewController 的情况下获取硬币数量。

您应该将 coinsAmount 声明为可选:

var coinsAmount: Int!

并在覆盖前检查是否为nil,以免不小心覆盖掉传递的值

if coinsAmount == nil {
    let defaults = UserDefaults.standard
    if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) {
        coinsAmount = Int(stringOne)!
    }
}