Schmob
Schmob

Reputation: 9

The Buttons Mixed up

ID LIKE TO START OFF BY SAYING I AM A STUDENT AND I AM CURRENTLY LEARNING SWIFT. I DON'T HAVE A 100% UNDERSTANDING.

Hey, so, my buttons keep getting mixed up with the code. I tell on button to display a message on a label when its clicked, but it displays something else that I told another button to do. I don't know how to explain the problem that well, sorry.

I have the top button (there's four total) display "You Are Correct!" and also have a button appear, written in code but when I press the button, when I run the app, it displays "You Are Wrong!", which is what all the other buttons are supposed to say.

Its a quiz game with Music related terms.

I've tried changing the tags for the buttons (1-4) and that didn't work, I also tried just disconnecting them and deleting them off the story board and adding everything back on, but that also didn't work.

import UIKit

class QuizVC: UIViewController {

@IBOutlet weak var questionLabel: UILabel!
@IBOutlet weak var answerLabel: UILabel!




@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!
@IBOutlet weak var button4: UIButton!

@IBOutlet weak var Next: UIButton!

var CorrectAnswer = String()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    RandomQuestions()
}


func RandomQuestions() {
    var RandomNumber = arc4random() % 5
    var RandomQuestion = arc4random() % 4
    RandomQuestion += 1
    RandomNumber += 1
    Next.isHidden = true

    switch(RandomNumber) {

    case 1:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "What is the tail end of a piece of music?"
            button1.setTitle("Coda", for: UIControl.State.normal)
            button2.setTitle("Da Capo", for: UIControl.State.normal)
            button3.setTitle("Forte", for: UIControl.State.normal)
            button4.setTitle("Largo", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "What is the tail end of a piece of music?"
            button1.setTitle("Da Capo", for: UIControl.State.normal)
            button2.setTitle("Largo", for: UIControl.State.normal)
            button3.setTitle("Coda", for: UIControl.State.normal)
            button4.setTitle("Forte", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "What is the tail end of a piece of music?"
            button1.setTitle("Largo", for: UIControl.State.normal)
            button2.setTitle("Da Capo", for: UIControl.State.normal)
            button3.setTitle("Forte", for: UIControl.State.normal)
            button4.setTitle("Coda", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "What is the tail end of a piece of music?"
            button1.setTitle("Largo", for: UIControl.State.normal)
            button2.setTitle("Coda", for: UIControl.State.normal)
            button3.setTitle("Forte", for: UIControl.State.normal)
            button4.setTitle("Da Capo", for: UIControl.State.normal)
            CorrectAnswer = "2"
        }
        break
    case 2:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Another name for Majestically?"
            button1.setTitle("Lunga", for: UIControl.State.normal)
            button2.setTitle("Dolce", for: UIControl.State.normal)
            button3.setTitle("Maestoso", for: UIControl.State.normal)
            button4.setTitle("Molto", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Another name for Majestically?"
            button1.setTitle("Dolce", for: UIControl.State.normal)
            button2.setTitle("Lunga", for: UIControl.State.normal)
            button3.setTitle("Molto", for: UIControl.State.normal)
            button4.setTitle("Maestoso", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Another name for Majestically?"
            button1.setTitle("Molto", for: UIControl.State.normal)
            button2.setTitle("Maestoso", for: UIControl.State.normal)
            button3.setTitle("Lunga", for: UIControl.State.normal)
            button4.setTitle("Dolce", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else {
            questionLabel.text = "Another name for Majestically?"
            button1.setTitle("Maestoso", for: UIControl.State.normal)
            button2.setTitle("Dolce", for: UIControl.State.normal)
            button3.setTitle("Lunga", for: UIControl.State.normal)
            button4.setTitle("Molto", for: UIControl.State.normal)
            CorrectAnswer = "1"
        }
        break
    case 3:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Another name for Time/Speed?"
            button1.setTitle("Largo", for: UIControl.State.normal)
            button2.setTitle("Soli", for: UIControl.State.normal)
            button3.setTitle("Tenuto", for: UIControl.State.normal)
            button4.setTitle("Tempo", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Another name for Time/Speed?"
            button1.setTitle("Soli", for: UIControl.State.normal)
            button2.setTitle("Tenuto", for: UIControl.State.normal)
            button3.setTitle("Tempo", for: UIControl.State.normal)
            button4.setTitle("Largo", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Another name for Time/Speed?"
            button1.setTitle("Tempo", for: UIControl.State.normal)
            button2.setTitle("Largo", for: UIControl.State.normal)
            button3.setTitle("Soli", for: UIControl.State.normal)
            button4.setTitle("Tenuto", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else {
            questionLabel.text = "Another name for Time/Speed?"
            button1.setTitle("Largo", for: UIControl.State.normal)
            button2.setTitle("Tempo", for: UIControl.State.normal)
            button3.setTitle("Tenuto", for: UIControl.State.normal)
            button4.setTitle("Soli", for: UIControl.State.normal)
            CorrectAnswer = "2"
        }
        break
    case 4:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Another name for Softly"
            button1.setTitle("Piano", for: UIControl.State.normal)
            button2.setTitle("Forte", for: UIControl.State.normal)
            button3.setTitle("Segno", for: UIControl.State.normal)
            button4.setTitle("Tacet", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Another name for Softly"
            button1.setTitle("Forte", for: UIControl.State.normal)
            button2.setTitle("Tacet", for: UIControl.State.normal)
            button3.setTitle("Piano", for: UIControl.State.normal)
            button4.setTitle("Segno", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Another name for Softly"
            button1.setTitle("Tacet", for: UIControl.State.normal)
            button2.setTitle("Segno", for: UIControl.State.normal)
            button3.setTitle("Forte", for: UIControl.State.normal)
            button4.setTitle("Piano", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "Another name for Softly"
            button1.setTitle("Forte", for: UIControl.State.normal)
            button2.setTitle("Piano", for: UIControl.State.normal)
            button3.setTitle("Segno", for: UIControl.State.normal)
            button4.setTitle("Tacet", for: UIControl.State.normal)
            CorrectAnswer = "2"
        }
        break
    case 5:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Another name for Really Fast?"
            button1.setTitle("Staccato", for: UIControl.State.normal)
            button2.setTitle("Fermata", for: UIControl.State.normal)
            button3.setTitle("Presto", for: UIControl.State.normal)
            button4.setTitle("Mezzo", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Another name for Really Fast?"
            button1.setTitle("Fermata", for: UIControl.State.normal)
            button2.setTitle("Presto", for: UIControl.State.normal)
            button3.setTitle("Staccato", for: UIControl.State.normal)
            button4.setTitle("Mezzo", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Another name for Really Fast?"
            button1.setTitle("Fermata", for: UIControl.State.normal)
            button2.setTitle("Mezzo", for: UIControl.State.normal)
            button3.setTitle("Staccato", for: UIControl.State.normal)
            button4.setTitle("Presto", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "Another name for Really Fast?"
            button1.setTitle("Presto", for: UIControl.State.normal)
            button2.setTitle("Mezzo", for: UIControl.State.normal)
            button3.setTitle("Staccato", for: UIControl.State.normal)
            button4.setTitle("Fermata", for: UIControl.State.normal)
            CorrectAnswer = "1"
        }
    default:

        break
    }
}




@IBAction func NextAction(_ sender: Any) {
    RandomQuestions()
    answerLabel.text = ""
}


@IBAction func button1Action(_ sender: Any) {
    if (CorrectAnswer == "1"){
        answerLabel.text = "You Are Correct!"
        Next.isHidden = false
    } else {
        answerLabel.text = "You Are Wrong!"
        Next.isHidden = true
    }
}

@IBAction func button2Action(_ sender: Any) {
    if (CorrectAnswer == "2"){
        answerLabel.text = "You Are Correct!"
        Next.isHidden = false
    } else {
        answerLabel.text = "You Are Wrong!"
        Next.isHidden = true
    }
}

@IBAction func button3Action(_ sender: Any) {
    if (CorrectAnswer == "3"){
        answerLabel.text = "You Are Correct!"
        Next.isHidden = false
    } else {
        answerLabel.text = "You Are Wrong!"
        Next.isHidden = true
    }
}

@IBAction func button4Action(_ sender: Any) {
    if (CorrectAnswer == "4"){
        answerLabel.text = "You Are Correct!"
        Next.isHidden = false
    } else {
        answerLabel.text = "You Are Wrong!"
        Next.isHidden = true
    }
}

}

Why is this happening? How can I fix it? I've looked through the code and didn't see any errors but I might just be too inexperienced to actually notice the real errors.

Upvotes: 0

Views: 57

Answers (1)

vacawama
vacawama

Reputation: 154533

You have a lot of duplication in your code. You can share an @IBAction for all of your answer buttons if you make use of the button tag. Also, if you shuffle() the answers, you can eliminate more duplicated code.

Your mix up in the buttons might have been that you had buttons accidentally connected to multiple @IBActions. That can happen if you copy a button in the Storyboard after it has a connection. Then adding a second connection caused the button to call two @IBActions. This updated code is much more straightforward and should eliminate such a mixup.

import UIKit

// The format of the data is ["Question", "correct answer", "wrong answer 1", "wrong answer 2",
// "wrong answer 3"].  The answers will be shuffled after a random question has been chosen.
let quizData: [[String]] = [
    ["What is the tail end of a piece of music?", "Coda", "Da Capo", "Forte", "Largo"],
    ["Another name for Majestically?", "Maestoso", "Dolce", "Lunga", "Molto"],
    ["Another name for Time/Speed?", "Tempo", "Largo", "Soli", "Tenuto"],
    ["Another name for Softly", "Piano", "Forte", "Segno", "Tacet"],
    ["Another name for Really Fast?", "Presto","Mezzo", "Staccato", "Fermata"]
]

class QuizVC: UIViewController {

    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var answerLabel: UILabel!

    @IBOutlet weak var button1: UIButton!
    @IBOutlet weak var button2: UIButton!
    @IBOutlet weak var button3: UIButton!
    @IBOutlet weak var button4: UIButton!

    @IBOutlet weak var nextButton: UIButton!

    var correctAnswer = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set tag for each button.  This could also be done in Storyboard
        for (idx, button) in [button1, button2, button3, button4].enumerated() {
            button?.tag = idx + 1
        }
        randomQuestions()
    }

    func randomQuestions() {
        // Pick a random question
        let questionData = quizData.randomElement()
        let rightAnswer = questionData[1]

        // Shuffle the answers
        let randomAnswers = questionData.dropFirst().shuffled()

        // Find out where the correct answer ended up
        correctAnswer = randomAnswers.firstIndex(of: rightAnswer)! + 1

        questionLabel.text = questionData[0]
        for (idx, button) in [button1, button2, button3, button4].enumerated() {
            button?.setTitle(randomAnswers[idx], for: .normal)
        }

        nextButton.isHidden = true
    }

    @IBAction func nextAction(_ sender: UIButton) {
        randomQuestions()
        answerLabel.text = ""
    }

    // Connect buttons 1 through 4 to this action
    @IBAction func buttonAction(_ sender: UIButton) {
        if correctAnswer == sender.tag {
            answerLabel.text = "You Are Correct!"
            nextButton.isHidden = false
        } else {
            answerLabel.text = "You Are Wrong!"
            nextButton.isHidden = true
        }
    }

}

Upvotes: 1

Related Questions