Передача неверных данных через segue - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь рандомизировать вопросы для моей викторины, и появляется ли ответ, если на ответ был дан неправильный ответ.Я думаю, что это может иметь отношение к моему NewNumber (), но я не могу понять это.

Иногда это работает для первых 3 вопросов, но затем, даже когда правильный ключ выбран с помощью кнопки, запускается переход.

Итак, я бы хотел: -рандомизированные вопросы (без повторов, но мне пришлось избавиться от 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
        }
    }


}

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Ответ тот же, что и у Роберт Дреслер написано.

И пара дополнений:

  1. Лучше использовать константу для идентификаторов segue вместо конкретных строк:

Пример:

struct SegueIdentifiers {      
    static let popUp = "PopUp"
    static let finishWindow = "FinishWindow"   
}

Это приведение не очень безопасно:

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
    }
Если вы используете swift 4.2, вы можете использовать Int.random(0..<allQuestions2.list.count) вместо Int(arc4random_uniform(UInt32(allQuestions2.list.count)))

PS Если вам интересно, как написать более читаемый код, вы можете проверить Руководство по стилю Raywenderlich Swift например.

0 голосов
/ 10 декабря 2018

В методе newNumber вы присваиваете questionNumber, но при подготовке к переходу вы присваиваете oldQNumber в качестве переменной vc1.Поскольку вы не измените oldQNumber после того, как позвоните newNumber, я полагаю, вы хотите передать questionNumber

vc1.InformationRoundNumber = questionNumber
...