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)!
}
}
我正在使用 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)!
}
}