首页 > 解决方案 > 冲突调用 viewDidLoad() 和另一个代码块

问题描述

有问题的屏幕我试图在viewDidLoad()这里用question()func 调用 func 一定次数,然后才调用要推送的新视图控制器的代码。但是,两者的代码是在同一时间执行的,因此第一轮结束后,视图控制器就会被推送。我尝试过使用不同变体的循环,但这些尝试都导致了相似的结果。想法?并提前感谢!


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)"
}

标签: swiftuiviewcontrolleruikitviewdidload

解决方案


我们可以在这里改进的地方很少。我将从基础开始。由于这些数字在开始时未设置,因此我们不必分配它们。因此,我们可以将它们保留为 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)"
}

到目前为止,一切都很好。现在我们必须根据按钮发送函数中的随机值检查输入。与其强制展开 ( !),不如安全展开 ( ?)。

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

推荐阅读