对 viewDidLoad() 和另一个代码块的调用冲突
Conflicting calls to viewDidLoad() and another block of code
Screen in question 我试图在这里调用 viewDidLoad()
函数和 question()
函数一定次数,然后才调用要推送的新视图控制器的代码.但是,两者的代码是在同一时间执行的,因此一旦第一轮结束,视图控制器就会被推送。我尝试过使用不同变体的循环,但这些尝试都导致了相似的结果。想法?提前致谢!
var num1 = Int()
var num2 = Int()
var userInput = 0
@IBAction func numbers(_ sender: UIButton) {
answerLabel.text = answerLabel.text! + String(sender.tag - 1)
userInput = Int(answerLabel.text!)!
answer()
}
override func viewDidLoad() {
super.viewDidLoad()
// Views configuration
question()
}
func answer() {
let answer = num1 + num2
if userInput == answer {
answerLabel.text = ""
viewDidLoad()
let scoreVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ScoreViewController") as! ScoreViewController
self.navigationController?.pushViewController(scoreVC, animated: true)
}
}
func question() {
num1 = Int(arc4random_uniform(100))
num2 = Int(arc4random_uniform(100))
questionLabel.text = "\(num1) + \(num2)"
}
这里我们可以改进的地方很少。我将从基础开始。
由于这些数字在开始时未设置,因此我们不必分配它们。因此,我们可以将它们保留为 Optionals,而不是将它们设置为默认值,这样我们就可以定义类型,然后将它们留作以后的赋值。
var num1: Int?
var num2: Int?
现在我们要展示一个问题。问题是, viewDidLoad
只能在 - 顾名思义 - 视图加载时使用。因此,我们只需创建一个方法并将我们的逻辑移到那里。你已经这样做了,我只是将你的函数重命名为一个更通俗易懂的名称
viewDidLoad() {
showNewQuestion()
}
showNewQuestion() { // previously question()
num1 = Int(arc4random_uniform(100))
num2 = Int(arc4random_uniform(100))
questionLabel.text = "\(num1) + \(num2)"
}
到目前为止一切顺利。现在我们要根据 Button 发送函数中的随机值检查输入。与其强制展开 (!
),不如安全地展开 (?
)。
@IBAction func numbers(_ sender: UIButton) {
guard let userInput = answerLabel.text, let userInputAsInt = Int(userInput) else {
return
}
checkAnswer(userInput: userInputAsInt) // previously answere()
}
最后,我们改进了您的 answer()
功能。你剩下的事情就是统计回答了多少问题。如果我们不检查程序应该如何知道何时显示分数?为了解决这个问题,我们记住了有多少问题被问到 (correctAnsweres
) 并且我们定义了一个何时显示分数的阈值 (showScoreAfter
)
var correctAnsweres = 0
var showScoreAfter = 5
func checkAnswer(userInputAsInt: Int) {
let answer = num1 + num2
if userInputAsInt != answers { // early exit if answered wrong
return
}
correctAnsweres += 1
answerLabel.text = ""
//either show score
if correctAnsweres % ShowScoreAfter == 0 {
let scoreVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ScoreViewController") as! ScoreViewController
self.navigationController?.pushViewController(scoreVC, animated: true)
}
// or new Question
else {
showNewQuestion()
}
}
Screen in question 我试图在这里调用 viewDidLoad()
函数和 question()
函数一定次数,然后才调用要推送的新视图控制器的代码.但是,两者的代码是在同一时间执行的,因此一旦第一轮结束,视图控制器就会被推送。我尝试过使用不同变体的循环,但这些尝试都导致了相似的结果。想法?提前致谢!
var num1 = Int()
var num2 = Int()
var userInput = 0
@IBAction func numbers(_ sender: UIButton) {
answerLabel.text = answerLabel.text! + String(sender.tag - 1)
userInput = Int(answerLabel.text!)!
answer()
}
override func viewDidLoad() {
super.viewDidLoad()
// Views configuration
question()
}
func answer() {
let answer = num1 + num2
if userInput == answer {
answerLabel.text = ""
viewDidLoad()
let scoreVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ScoreViewController") as! ScoreViewController
self.navigationController?.pushViewController(scoreVC, animated: true)
}
}
func question() {
num1 = Int(arc4random_uniform(100))
num2 = Int(arc4random_uniform(100))
questionLabel.text = "\(num1) + \(num2)"
}
这里我们可以改进的地方很少。我将从基础开始。 由于这些数字在开始时未设置,因此我们不必分配它们。因此,我们可以将它们保留为 Optionals,而不是将它们设置为默认值,这样我们就可以定义类型,然后将它们留作以后的赋值。
var num1: Int?
var num2: Int?
现在我们要展示一个问题。问题是, viewDidLoad
只能在 - 顾名思义 - 视图加载时使用。因此,我们只需创建一个方法并将我们的逻辑移到那里。你已经这样做了,我只是将你的函数重命名为一个更通俗易懂的名称
viewDidLoad() {
showNewQuestion()
}
showNewQuestion() { // previously question()
num1 = Int(arc4random_uniform(100))
num2 = Int(arc4random_uniform(100))
questionLabel.text = "\(num1) + \(num2)"
}
到目前为止一切顺利。现在我们要根据 Button 发送函数中的随机值检查输入。与其强制展开 (!
),不如安全地展开 (?
)。
@IBAction func numbers(_ sender: UIButton) {
guard let userInput = answerLabel.text, let userInputAsInt = Int(userInput) else {
return
}
checkAnswer(userInput: userInputAsInt) // previously answere()
}
最后,我们改进了您的 answer()
功能。你剩下的事情就是统计回答了多少问题。如果我们不检查程序应该如何知道何时显示分数?为了解决这个问题,我们记住了有多少问题被问到 (correctAnsweres
) 并且我们定义了一个何时显示分数的阈值 (showScoreAfter
)
var correctAnsweres = 0
var showScoreAfter = 5
func checkAnswer(userInputAsInt: Int) {
let answer = num1 + num2
if userInputAsInt != answers { // early exit if answered wrong
return
}
correctAnsweres += 1
answerLabel.text = ""
//either show score
if correctAnsweres % ShowScoreAfter == 0 {
let scoreVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ScoreViewController") as! ScoreViewController
self.navigationController?.pushViewController(scoreVC, animated: true)
}
// or new Question
else {
showNewQuestion()
}
}