通过segue传递错误的数据



我试图将我的测验的问题随机化,如果答案不正确,则会出现segue。我想这可能与我的NewNumber((有关,但我想不通。

有时它适用于前3个问题,但即使通过按钮选择了正确的答案,segue也会被触发。

所以,我喜欢的是:-随机问题(没有重复,但我不得不删除列表。删除,因为它把正确答案搞砸了更多(-如果按下了错误的答案,我希望它触发到另一个屏幕的正确对应信息

我列出了完整的代码,因为我不知道它是否也与我的订单或函数有关。

class RoundThree: UIViewController {
@IBOutlet weak var FuelLevel: UIImageView!
@IBOutlet weak var QuestionLabel: UILabel!
@IBOutlet weak var Car: UIImageView!
@IBOutlet weak var SmallTown: UIImageView!
//Outlet for Buttons
@IBOutlet weak var OptionA: UIButton!
@IBOutlet weak var OptionB: UIButton!
@IBOutlet weak var OptionC: UIButton!

let allQuestions2 = QuestionBank2()
var questionNumber: Int = 0
var oldQNumber: Int = 0
var score: Int = 0
var selectedAnswer: Int = 0
var fuelleackage: CGFloat = 0
var wronganswer: Int = 0
let screenSize: CGRect = UIScreen.main.bounds
var questionsasked = [Int]()

override func viewDidLoad() {
newNumber()
startQuiz()
super.viewDidLoad()
}
@IBAction func answerPressed(_ sender: UIButton){
if sender.tag == selectedAnswer {
Car.frame.origin.x  += 40
score += 1
fuelleackage += 0.0
NewYorkCity()
}  else if sender.tag != selectedAnswer {
fuelleackage += 40.0
wronganswer += 1
EducateYourself()
NewYorkCity()

}
updateUI()
}
func updateQuestion(){
QuestionLabel.text = allQuestions2.list[oldQNumber].question
OptionA.setTitle(allQuestions2.list[oldQNumber].optionA, for: UIControl.State.normal)
OptionB.setTitle(allQuestions2.list[oldQNumber].optionB, for: UIControl.State.normal)
OptionC.setTitle(allQuestions2.list[oldQNumber].optionC, for: UIControl.State.normal)
selectedAnswer = allQuestions2.list[oldQNumber].CorrectAns
}


func updateUI(){
FuelLevel.frame.size.width = screenSize.width * (1.0-0.15 * CGFloat(wronganswer))
oldQNumber = questionNumber
newNumber()
updateQuestion()
questionsasked.append(questionNumber)
}
//Carol.frame.origin.x  += 30

func startQuiz (){
score = 0
updateQuestion()
updateUI()
}

func NewYorkCity(){
if (Car.frame.origin.x + (Car.frame.width / 2))  > (SmallTown.frame.origin.x + SmallTown.frame.width) {
performSegue(withIdentifier: "FinishWindow", sender: self)
}
else if (screenSize.width * (1.0-0.15 * CGFloat(wronganswer)) <= 0)
{ performSegue(withIdentifier: "saaaad", sender: self)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "PopUp2") {
let vc1 = segue.destination as! CorrectInfoPopUp2
vc1.InformationRoundNumber = oldQNumber
}
}
func EducateYourself(){
performSegue(withIdentifier: "PopUp2", sender: self)
}
func newNumber() {
for _ in 0..<allQuestions2.list.count {
var rand = Int(arc4random_uniform(UInt32(allQuestions2.list.count)))
while questionsasked.contains(rand) {
rand = Int(arc4random_uniform(UInt32(allQuestions2.list.count)))
}
questionNumber = rand
}
}

}

newNumber方法中,您将分配questionNumber,但在为segue做准备时,您将oldQNumber分配为vc1的变量。因为你在调用newNumber后不会更改oldQNumber,我想你想通过questionNumber

vc1.InformationRoundNumber = questionNumber

与Robert Dresler所写的答案相同。

还有几个附加组件:

  1. 最好使用常量作为segue标识符,而不是具体字符串:

示例:

struct SegueIdentifiers {      
static let popUp = "PopUp"
static let finishWindow = "FinishWindow"   
}
  1. 这个角色并不安全:

    if (segue.identifier == "PopUp2") {
    let vc1 = segue.destination as! CorrectInfoPopUp2
    vc1.InformationRoundNumber = oldQNumber
    }
    

所以写这样的东西要好一点:

if segue.identifier == SegueIdentifiers.popUp, let vc = segue.destination as? CorrectInfoPopUp2 {
vc.InformationRoundNumber = questionNumber
}
  1. 如果使用swift 4.2,则可以使用Int.random(0..<allQuestions2.list.count)而不是Int(arc4random_uniform(UInt32(allQuestions2.list.count)))

p.S.如果你对如何编写可读性更强的代码感兴趣,你可以查看Raywenderlich的Swift Style Guide。

最新更新