swift - 冲突调用 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)"
}
解决方案
我们可以在这里改进的地方很少。我将从基础开始。由于这些数字在开始时未设置,因此我们不必分配它们。因此,我们可以将它们保留为 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()
}
}
推荐阅读
- mysql - 无法进行 sql 查询以获取一周前的数据
- php - 数组值的数组过滤器
- html - CSS配置div高度等于兄弟姐妹
- python - 如何从网址中获取字节,然后转换为.png
- vue.js - NUXT 中的 CSP 设置
- google-app-engine - 在 Google App Engine 上获取 504 网关错误(Flask App 的长时间运行)
- microsoft-graph-api - 仅在包含的实体、Microsoft Graph API、组、PowerShell 上支持写入请求
- makefile - Make:动态文件递归?
- c# - Acceso denegado a la ruta de acceso C#
- azure - 用于返回分配给应用程序的组的 PowerShell 脚本