【问题标题】:Passing wrong data through segue通过 segue 传递错误的数据
【发布时间】:2019-05-11 09:10:44
【问题描述】:

我正在尝试随机化我的测验问题,如果答案不正确,则会出现转场。我认为这可能与我的 NewNumber() 有关,但我无法弄清楚。

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

所以,我喜欢的是: - 随机问题(没有重复,但我不得不摆脱 list.remove 因为它更加混乱了正确答案) - 如果按下了错误的答案,我希望它触发具有正确相应信息的另一个屏幕

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

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


}

【问题讨论】:

    标签: ios swift uiviewcontroller segue uistoryboard


    【解决方案1】:

    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..&lt;allQuestions2.list.count) 而不是 Int(arc4random_uniform(UInt32(allQuestions2.list.count)))

    附:如果您对如何编写更具可读性的代码感兴趣,可以查看Raywenderlich's Swift Style Guide 示例。

    【讨论】:

      【解决方案2】:

      newNumber 方法中,您分配了questionNumber,但在为segue 做准备时,您将oldQNumber 分配为vc1 的变量。因为你在调用newNumber之后并没有改变oldQNumber,所以我猜你想通过questionNumber

      vc1.InformationRoundNumber = questionNumber
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 2015-01-13
        • 1970-01-01
        相关资源
        最近更新 更多