为什么我必须按两次IBAction按钮才能执行操作?

时间:2015-08-19 02:16:28

标签: xcode swift

我正在制作一个按下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进行计算并更改标签的输入。我猜我为什么要按两次是第一次按下进行计算,第二次按下更改标签以显示结果。

1 个答案:

答案 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”的函数开头输入一个。