Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 为什么我必须按两次iAction按钮才能执行操作?_Xcode_Swift - Fatal编程技术网

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

Xcode 为什么我必须按两次iAction按钮才能执行操作?,xcode,swift,Xcode,Swift,我正在制作一个应用程序,在按下iAction按钮时进行计算。它工作正常,但我必须按两下才能执行操作。有人有这方面的经验吗?下面是有关@iAction按钮的一些代码: @IBAction func CalculateGPA(sender: AnyObject) { gpa = (gp + gp2 + gp3 + gp4 + gp5 + gp6 + gp7) / (ch

我正在制作一个应用程序,在按下iAction按钮时进行计算。它工作正常,但我必须按两下才能执行操作。有人有这方面的经验吗?下面是有关@iAction按钮的一些代码:

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

对于您的信息,此按钮进行计算并更改标签的输入。我想我必须按两次的原因是第一次按进行计算,第二次按更改标签以显示结果。

首先,您用于计算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
    }
    // ...
var分子:Int=0
var totalCh:Int=0
var gpa:Double=0.0
//gp和ch应该是作为实例变量的数组;
//应该已经在此函数中或
//从另一个地方
对于(变量i:Int=0;i0){
gpa=双(分子)/双(总CH)
}否则{
gpa=0.0//不能除以0。可能需要向此处的用户发送错误消息
}
// ...
此外,您应该在函数顶部对用户输入进行验证,而不是在完成计算之后。如果用户犯了错误,您应该向用户提供一些反馈,说明他做错了什么以及如何纠正错误(正如您所做的那样),但在所有验证都完成之前,不要进行任何计算

要回答您最初的问题,我们需要查看该函数的所有代码。如果textfield1和textfield2在其他地方填写,则可以查看它们的位置

您可能没有将iAction正确连接到按钮。进入连接检查器,点击故事板上的按钮,将看到的内容制作一个屏幕打印并发布在这里,这样我们就可以检查连接是否正确

但是,由于您必须按两次按钮才能看到任何结果,因此初始化失败的可能性更高,因此在您第一次按下按钮时,它的值为零或null,但在函数结束时它被初始化,因此当您再次按下按钮时,它进行了计算,并在标签中输入了答案


要确切地了解发生了什么,您应该尝试单步执行调试器。如果您没有这方面的经验,可以在IBAction函数的关键位置放置一组print语句,以查看正在计算的内容,查看正在执行的语句,并确保函数已经启动;至少在函数开头输入一个“输入iAction calculateGPA”。

我想我们没有看到更大的画面。首先,textField1的相关代码在哪里?必须调试它!在action方法和single step中放置一个断点,以查看发生了什么,并在执行过程中检查变量。调试是一项最好及早学习的技能。哇,真是很棒的输入。我只希望在Xcode中有你一半的知识。非常感谢您的意见,我会仔细考虑一下,看看是否能落实您的一些建议。