私は新しいプログラマで、コントローラ間でデータを渡すのに苦労しています。この質問はこのフォーラムで尋ねられますが、アップロードされたコードは私のものと比べてはるかに複雑で、それは私が書いた私の数行をアップロードするでしょう。 2人のプレイヤーが自分の名前を自分のアプリに入力して、ゲームを開始することを許可します。ゲームの開始ボタンが押されると、Joe Bloggs vs John Doeのような名前を持つ新しいView Controllerに移動します。私は変数をグローバルにしますが、私の理解は悪い練習です。同じコードを書いて、View Controller内の変数を毎回渡すことなく、何が間違っているのか分かりませんか?ここで私の間違ったことを誰かが答えることができるように私のコードのいくつかの行ですか?View Controller間でデータを渡すと、nilが生成される
のViewController:
import UIKit
class ViewController: UIViewController {
var playerOneName: String!
var playerTwoName: String!
@IBOutlet weak var playerOneTextField: UITextField!
@IBOutlet weak var playerTwoTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func startGameButton(_ sender: Any) {
playerOneName = playerOneTextField.text!
playerTwoName = playerTwoTextField.text!
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segue" {
let destinationVC = segue.destination as! GameViewController
destinationVC.playerOne.text = playerOneName
destinationVC.playerTwo.text = playerTwoName
}
}
}
GameViewController:あなたのコントローラのビューがロードされるまで、あなたの出口は初期化されません
import UIKit
class GameViewController: UIViewController {
@IBOutlet weak var playerOne: UILabel!
@IBOutlet weak var playerTwo: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
はあなたが点検したお役に立てば幸いですか!ボタンのコールバックの前に 'prepare(for:sender:)'が呼び出されたらどうなるでしょうか? – gskbyte
'destinationVC.playerOne.text = playerOneName'を実行すると、' playerOne'は 'nil'です。つまり、 'IBOulet'はまだロードされていません。 'playerOneName'値を保持する' String'プロパティを作成します。 'viewDidLoad()'に 'playerOne.text'を設定します。 – Larme
Objective-Cでは、理由は同じです:https://stackoverflow.com/questions/18137073/set-uitextfield-text-property-in-prepareforsegueまたはhttps://stackoverflow.com/questions/9576177/how-ユーラベル・オブ・ア・セグの価値を生み出すことができます – Larme