简体   繁体   English

试图追查为什么我从一个视图到另一个视图取回 Nil 数据

[英]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.

相关问题 将数据从一个ViewController传递到另一个ViewController时,为什么会收到nil? - Why am I receiving a nil when passing data from one viewcontroller to another? 我正在尝试通过“准备转场”将数据从一个视图控制器传递到另一个视图控制器,但它崩溃了 - I am trying to pass data from one View Controller to another in Swift via 'prepare for segue' but it crashes 为什么我尝试将密钥保存到钥匙串时又得到errSecParam(-50)? - Why am I getting errSecParam (-50) back from trying to save a key to keychain? 为什么会出现nil错误? - Why am I getting a nil error? 为什么我的字符串值不为零? - Why am I getting nil for this string value? 我有一个模型,其中我得到一个键值nil但数据来自json响应是完美的 - I have a model in which i am getting one key value nil but data comes in json response is perfect 我正在尝试使用segues展开时将字符串从一个视图控制器传递到另一视图控制器,但我无法这样做 - I am trying to pass a string from one view controller to another view controller while unwinding using segues and I am not able to do so 我正在尝试使用 Swift Codable 从 subreddit 解析 JSON。 为什么我的对象返回 nil? - I am trying to parse JSON from a subreddit with Swift Codable. Why are my objects returning nil? 我无法使用此代码从本地主机获取数据。 请帮我。 我越来越零 - I am not able to get data from my localhost using this code. Please help me. I am getting nil 当我尝试使用 Apple 登录时,我将 Email 和 FullName 作为 nil 值 - I am getting Email and FullName as nil values when I am trying to SignIn with Apple
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM