我正在制作一个按下IBAction按钮进行计算的应用程序。它工作正常,但我必须按两次才能发生Action。有人有这方面的经验吗?以下是有问题的@IBAction按钮中的一些代码:
@IBAction func CalculateGPA(sender: AnyObject) {
gpa = (gp + gp2 + gp3
+ gp4 + gp5 + gp6
+ gp7) / (ch + ch2
+ ch3 + ch4 + ch5
+ ch6 + ch7)
gpaLabel.text = NSString(format: " Your GPA is %.2f", gpa) as String
//added if textField == ">9" after first submission
if textField1.text == "10"{
gpaLabel.text = "Enter 1-9 Credit Hours"
}
if textField2.text == "10"{
gpaLabel.text = "Enter 1-9 Credit Hours"
}
对于您的信息,此Button进行计算并更改标签的输入。我猜我为什么要按两次是第一次按下进行计算,第二次按下更改标签以显示结果。
答案 0 :(得分:1)
首先,您用于计算GPA的公式不正确。您不应该将总成绩加起来并除以您正在进行的总学分。你必须将每个年级乘以学分小时数,再加上,然后除以学分总时数:
gpa = (gp * ch + gp2 * ch2 + gp3 * ch3 + gp4 * ch4 +
gp5 * ch5 + gp6 * ch6 + gp7 * ch7) /
(ch + ch2 + ch3 + ch4 + ch5 + ch6 + ch7)
此外,您可能希望在for循环中使用数组,以便在类数更改时可以处理任意数量的类。想象一下,如果你有100个课程,把所有这些放在一个巨大的声明中将是愚蠢和耗时的:
gpa = (gp * ch + gp2 * ch2 + gp3 * ch3 + gp4 * ch4 +
gp5 * ch5 + gp6 * ch6 + gp7 * ch7 ... gp100 * ch100) /
(ch + ch2 + ch3 + ch4 + ch5 + ch6 + ch7 + ... ch100)
相反说:
var numerator: Int = 0
var totalCh : Int = 0
var gpa : Double = 0.0
// gp and ch should be arrays that are instance variables;
// they should already be filled in either in this function or
// from another location
for (var i: Int = 0; i < gp.count; i++) {
numerator += gp [i] * ch [i]
totalCh += ch [i]
}
if (totalCh > 0) {
gpa = Double (numerator) / Double (totalCh)
} else {
gpa = 0.0 // can't divide by 0. Might want an error message to user here
}
// ...
此外,您应该在功能顶部验证用户输入,而不是在完成计算后。如果用户犯了错误,您应该向用户提供一些反馈,告诉用户他做错了什么以及如何修复(如您所做的那样),但在完成所有验证之前不要进行计算。
要回答原始问题,我们需要查看该功能的所有代码。如果textfield1和textfield2在其他地方填充,则有助于查看它们适合的位置。
您可能没有将IBAction正确连接到按钮上。进入Connections Inspector并单击StoryBoard中的按钮,然后制作所看到的屏幕图并将其发布到此处,以便我们检查您是否正确连接。
但是,由于您必须按两次按钮才能看到任何结果,因此初始化某些内容的可能性更高,因此第一次按下按钮时它的值为零或为零,但随后在函数结束时初始化,所以当你再次按下按钮时,它会进行计算并在标签中输入答案。
要确切了解发生了什么,您应该尝试逐步调试。如果您对此没有任何经验,可以在IBAction函数的关键位置放置一堆打印语句,以查看正在计算的内容并查看正在执行的语句,并确保该函数已开始执行;至少在“输入IBAction calculateGPA”的函数开头输入一个。