[英]Trying to track down why I am getting back Nil data from one view to another
I have two view controllers both views are holding an integer of data from the textfield and that data I would like to be saved and or held so I can error check against that number on the next view.我有两个视图控制器,两个视图都保存来自文本字段的整数数据以及我想要保存和/或保存的数据,以便我可以在下一个视图中对该数字进行错误检查。 The issue is my data is always nil.
问题是我的数据始终为零。 If someone can shed some insight on why this is the case I would greatly appreciate it.
如果有人可以对为什么会出现这种情况有所了解,我将不胜感激。 Code below.
代码如下。
Thanks to Keshu the answer has been solved.感谢Keshu,答案已经解决。 I put the Code below in the else statement and works perfectly.
我将下面的代码放在 else 语句中并且完美运行。
gameInfo(player: yourdata, numberPicked: yourdata, datePlayed: yourdata, winner: yourdata, turn: yourdata)
First view第一次观看
class PlayerSelectViewController: UIViewController {
@IBOutlet weak var playerButton: UIButton!
@IBOutlet weak var playersTextBox: UITextField!
var gameInfo:GameInfo?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func cancelBtnClicked(_ sender: Any) {
self.navigationController?.popToRootViewController(animated: true)
}
@IBAction func okBtnClicked(_ sender: Any) {
guard let playerTotal = Int(playersTextBox.text!) else {
makeAlert(title: "Enter a Number", message: "Please enter a number and then press Ok")
return
}
if playerTotal < 2 {
makeAlert(title: "Incorrect Number", message: "Please input more than \(playersTextBox.text!)")
} else if playerTotal > 50 {
makeAlert(title: "Incorrect Number", message: "Please input less than \(playersTextBox.text!)")
} else {
gameInfo?.player = playerTotal
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let serverController = segue.destination as! ServerSelectViewController
serverController.gameInfo = gameInfo
}
func makeAlert (title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: {(action) in
alert.dismiss(animated: true, completion: nil)}))
self.present(alert, animated: true, completion: nil)
}
Second view第二种观点
@IBOutlet weak var serverTextBox: UITextField!
@IBOutlet weak var serverButton: UIButton!
var gameInfo:GameInfo?
override func viewDidLoad() {
super.viewDidLoad()
print(gameInfo?.player as Any)
}
@IBAction func cancelBtnClicked(_ sender: Any) {
self.navigationController?.popToRootViewController(animated: true)
}
@IBAction func okBtnClicked(_ sender: Any) {
guard let number = Int(serverTextBox.text!) else {
makeAlert(title: "Enter a Number", message: "Please enter a number and then press Ok")
return
}
if number < 1 {
makeAlert(title: "Incorrect Number", message: "Please input more than \(serverTextBox.text!)")
} else if number > 1000 {
makeAlert(title: "Incorrect Number", message: "Please input less than \(serverTextBox.text!)")
} else {
gameInfo?.numberPicked = number
}
}
func makeAlert (title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: {(action) in
alert.dismiss(animated: true, completion: nil)}))
self.present(alert, animated: true, completion: nil)
}
Model模型
class GameInfo: Codable {
var player: Int
var numberPicked: Int
var datePlayed: Date
var winner: String
var turn: Int
init(player: Int, numberPicked: Int, datePlayed: Date, winner: String, turn: Int) {
self.player = player
self.numberPicked = numberPicked
self.datePlayed = datePlayed
self.winner = winner
self.turn = turn
}
static func loadGameInfo() -> [GameInfo] {
return []
}
static let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
static let archiveURL = documentsDirectory.appendingPathComponent("gameInformation").appendingPathExtension("plist")
static func saveToFile(gameInformation: [GameInfo]) {
let propertyListEncoder = PropertyListEncoder()
let gameInfo = try? propertyListEncoder.encode(gameInformation)
try? gameInfo?.write(to: archiveURL, options: .noFileProtection)
}
static func loadFromFile() -> [GameInfo]? {
guard let gameInfo = try? Data(contentsOf: archiveURL) else { return nil }
let propertyListDecoder = PropertyListDecoder()
return try? propertyListDecoder.decode(Array<GameInfo>.self, from: gameInfo)
} }
The issue is that you have created a segue from your button to your next view controller.问题是您已经创建了从按钮到下一个视图控制器的转场。 So by the time your okBtnClicked action is called, you are on your next view controller and so the data is nil.
因此,当您调用 okBtnClicked 操作时,您已在下一个视图控制器上,因此数据为零。
Remove the segue from your button and make it from your ViewController 1 to ViewController2.从您的按钮中删除 segue 并将其从您的 ViewController 1 设置为 ViewController2。 And then in your okBtnClicked function, performSegue at the end.
然后在您的 okBtnClicked 函数中,最后执行转义。
@IBAction func okBtnClicked(_ sender: Any) {
guard let number = Int(serverTextBox.text!) else {
makeAlert(title: "Enter a Number", message: "Please enter a number and then press Ok")
return
}
if number < 1 {
makeAlert(title: "Incorrect Number", message: "Please input more than \(serverTextBox.text!)")
} else if number > 1000 {
makeAlert(title: "Incorrect Number", message: "Please input less than \(serverTextBox.text!)")
} else {
gameInfo = GameInfo(player: number, numberPicked: 0, datePlayed: Date(), winner:"", turn: 0)
}
self.performSegue(withIdentifier: "yourSegueIdentifier", sender: self)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.