【发布时间】:2017-06-21 12:30:54
【问题描述】:
我是一名新程序员,正在努力在控制器之间传递数据,我知道在这些论坛中提出了这个问题,但上传的代码与我的相比要复杂得多,我很难理解它,所以将上传我的几行代码我写过。我想让两个玩家在我的应用程序中输入他们的名字,然后单击开始游戏。当按下开始游戏按钮时,它会将它们带到一个新的视图控制器,其名称类似于 Joe Bloggs vs John Doe,如果我将变量设为全局变量,我可以实现这一点,但我的理解是这是不好的做法,所以当我尝试和编写相同的代码,将变量保存在 View Controller 中,它每次都通过 nil,我不确定我做错了什么?这是我的几行代码,希望有人能回答我做错了什么?
视图控制器:
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
}
}
}
游戏视图控制器:
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:)会怎样? -
因为
playerOne是nil当你做destinationVC.playerOne.text = playerOneName。换句话说,IBOulet尚未加载。创建一个String属性,该属性将保存playerOneName值。在viewDidLoad()上将playerOne.text设置为它。 -
在 Objective-C 中,但原因是一样的:stackoverflow.com/questions/18137073/… 或 stackoverflow.com/questions/9576177/…
标签: ios swift xcode viewcontroller