对 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()
    }
}