2016-08-20 37 views
0

我的学校项目是一个儿童数学游戏,它除了测试他们,减法和乘法。我有两个链接到错误的VC。我保持的错误是,每次我选择任何选项时,它都会忽略所有其他操作,并遵循乘法说明!我已经尝试了一切,我对这个应用程序感到沮丧。我需要帮助调试这个错误 - 数学测验为孩子

Option_VC

class Option_VC: UIViewController { 

var addition_true: Bool = false 
var subtract_true: Bool = false 
var multiply_true: Bool = false 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if addition_true == true { 
     let nextVC: Quiz_VC = segue.destinationViewController as! Quiz_VC 
     nextVC.addition_true = true 
    }else if subtract_true == true { 
     let nextVC: Quiz_VC = segue.destinationViewController as! Quiz_VC 
     nextVC.subtract_true = true 
    }else { 
     let nextVC: Quiz_VC = segue.destinationViewController as! Quiz_VC 
     nextVC.multiply_true = true 
    } 
} 

@IBAction func addition_enter(sender: AnyObject) { 
    addition_true = true 
    multiply_true = false 
    subtract_true = false 
} 

@IBAction func subtract_enter(sender: AnyObject) { 
    subtract_true = true 
    addition_true = false 
    multiply_true = false 
} 

@IBAction func multiply_enter(sender: AnyObject) { 
    multiply_true = true 
    addition_true = false 
    subtract_true = false 
} 

}

Quiz_VC

class Quiz_VC: UIViewController { 

@IBOutlet var n1_lbl: UILabel! 
@IBOutlet var back: UIButton! 
@IBOutlet var next: UIButton! 
@IBOutlet var enter: UIButton! 
@IBOutlet var answer_field: UITextField! 
@IBOutlet var symbol_lbl: UILabel! 
@IBOutlet var n2_lbl: UILabel! 
@IBOutlet var comment_lbl: UILabel! 
@IBOutlet var score_lbl: UILabel! 
var addition_true: Bool = false 
var subtract_true: Bool = false 
var multiply_true: Bool = false 
var enter_entered_true: Bool = false 
var answer: UInt32 = 0 
var finalanswer: UInt32 = 0 
var n1: UInt32 = 0 
var n2: UInt32 = 0 
var count = 0 
var score = 0 
var temp: UInt32 = 0 
var operation: String = "" 


override func viewDidLoad() { 
    super.viewDidLoad() 
    back.hidden = true 
    next.hidden = true 
    if addition_true == true { 
     AdditionQuestions() 
    }else if subtract_true == true { 
     SubtractionQuestions() 
    } 
    if multiply_true == true && addition_true == false && subtract_true == false{ 
     MultiplicationQuestions() 
    } 
} 

func Operation() { 
    if addition_true == true { 
     operation = "1" 
    }else if subtract_true == true { 
     operation = "2" 
    }else { 
     operation = "3" 
    } 

    switch operation { 
    case "1": 
     finalanswer = n1 + n2 
    case "2": 
     finalanswer = n1 - n2 
    case "3": 
     finalanswer = n1 * n2 
    default: break 
    } 
} 

func AdditionQuestions() { 
    n1 = arc4random_uniform(9)+1 
    n2 = arc4random_uniform(9)+1 
    n1_lbl.text = "\(n1)" 
    n2_lbl.text = "\(n2)" 
    symbol_lbl.text = "+" 
    score_lbl.text = "" 
    comment_lbl.text = "" 
} 

func SubtractionQuestions() { 
    n1 = arc4random_uniform(9)+1 
    n2 = arc4random_uniform(9)+1 
    symbol_lbl.text = "-" 
    if n2 > n1 { 
     temp = n1 
     n1 = n2 
     n2 = temp 
    } 
    n1_lbl.text = "\(n1)" 
    n2_lbl.text = "\(n2)" 
} 

func MultiplicationQuestions() { 
    n1 = arc4random_uniform(9)+1 
    n2 = arc4random_uniform(9)+1 
    symbol_lbl.text = "×" 
    n1_lbl.text = "\(n1)" 
    n2_lbl.text = "\(n2)" 
} 

func EndQuiz() { 
    if count > 3 { 
     enter.hidden = true 
     next.hidden = true 
     back.hidden = false 
     score_lbl.text = "Score: \(score)" 
     comment_lbl.text = "Completed Quiz" 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func enter_entered(sender: AnyObject) { 
    if answer_field.text != nil { 
     enter_entered_true = true 
     answer = UInt32(answer_field.text!)! 
     count = count + 1 
     Operation() 
     if answer != finalanswer { 
      comment_lbl.text = "Incorrect" 
     } else { 
      comment_lbl.text = "Correct" 
      score = score + 1 
     } 
    } else { 
     comment_lbl.text = "Enter a number!" 
    } 
    enter.hidden = true 
    next.hidden = false 
} 

@IBAction func next_entered(sender: AnyObject) { 
    if addition_true == true { 
     AdditionQuestions() 
     comment_lbl.text = "" 
    }else if subtract_true == true { 
     SubtractionQuestions() 
     comment_lbl.text = "" 
    } 
    if multiply_true == true && addition_true == false && subtract_true == false{ 
     MultiplicationQuestions() 
     comment_lbl.text = "" 
    } 
    enter.hidden = false 
    next.hidden = true 
    EndQuiz() 
} 

}

+0

试试打印每个传输操作的布尔值, – Dravidian

回答

0

当你点击按钮(加,减或乘),那么应用程序立即执行prepareForSegue它执行与这些按钮相关的动作之前的一个。因此,addition_true,subtraction_truemultiplication_true都始终为假,代码将落入设置乘法选项的else子句。

要解决这个问题:

  1. 在故事板从三个按钮删除塞格斯。
  2. 从第一个视图控制器添加一个segue到第二个视图控制器(控制从第一个视图控制器顶部的黄色圆圈拖动到第二个视图控制器的主体)。
  3. 给这个SEGUE名称(突出SEGUE并将其命名为(“mainSegue”或东西)在属性检查器)
  4. 在代码中添加以下行到三个动作结束(addition_enter,等):

    performSegueWithIdentifier("mainSegue", sender: self)

这将确保该按钮的动作已经被执行后SEGUE被调用。

+0

谢谢你的这个作品。 –

0

在你Quiz_VC类更新viewDidLoad中()

override func viewDidLoad() { 
super.viewDidLoad() 
back.hidden = true 
next.hidden = true 
if addition_true == true { 
    AdditionQuestions() 
}else if subtract_true == true { 
    SubtractionQuestions() 
}else if multiply_true == true{ 
    MultiplicationQuestions() 
} 
} 

func Operation() { 
if addition_true == true { 
    operation = "1" 
}else if subtract_true == true { 
    operation = "2" 
}else if multiply_true == true { 
    operation = "3" 
} 

switch operation { 
case "1": 
    finalanswer = n1 + n2 
case "2": 
    finalanswer = n1 - n2 
case "3": 
    finalanswer = n1 * n2 
default: break 
} 
} 

@IBAction func next_entered(sender: AnyObject) { 
if addition_true == true { 
    AdditionQuestions() 
    comment_lbl.text = "" 
}else if subtract_true == true { 
    SubtractionQuestions() 
    comment_lbl.text = "" 
}else if multiply_true == true{ 
    MultiplicationQuestions() 
    comment_lbl.text = "" 
}else{ 
enter.hidden = false 
next.hidden = true 
EndQuiz() 
    } 

    } 
0

我认为你的@IBAction函数没有挂钩,或者没有被调用,因为按钮链接到一个segue。

这意味着所有Bools在prepareForSegue中都是错误的。并且该函数中的逻辑在这种情况下为乘法设置QuizVC(最后一个else子句没有if限定符)。

所以,保持在故事板中的塞格。在对象检查器中填充segue标识符字符串(Xcode中右侧的面板)。使用例如ADDITION_SEGUE,MULTIPLY_SEGUE,SUBTRACTION_SEGUE。你不必使用大写和下划线,这只是我的习惯。

Segue Identifier

然后在prepareForSegue:你可以告诉我们赛格瑞触发的操作。在此基础上设置QuizVC上的属性。那么你在OptionVC中完全不需要这些Bools。

在prepareForSegue:

if segue.identifier == "ADDITION_SEGUE" { 
    destinationViewController... 
} 

如何把同样一个枚举到QuizVC而不是使用BOOLS:

enum QuizType { 
    case Addition, Subtraction, Multiplication 
} 

这可能使事情从长远来看更容易一些。它有点帮助你管理状态,因为测验类型只是三个之一。虽然如果Bools为你工作的话,那就够公平了。