Есть ли функция, которую я могу использовать, чтобы найти, какая кнопка UIB была нажата, и вернуть true в false? - PullRequest
0 голосов
/ 25 октября 2019

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

Однако не имеет значения, на какую кнопку я нажимаю. Я получаю тот же ответ, "отстой".

Кто-нибудь может мне помочь с этим?

.........

Вот мой вопросBrain Swift File.

struct Quiz {

     let userQuestions = [

        Questions(q: "2 + 2", button1: "4", button2: "6", a: "4"),
        Questions(q: "20 x 2", button1: "10", button2: "40", a: "40"),
        Questions(q: "10 - 5", button1: "3", button2: "5", a: "5")

       ]

    var questionNumber = 0



    //Check answers
    func checkAnswer(_ userAnswer: String) -> String{


        if userAnswer == userQuestions[questionNumber].a {

            return "True"
        }


        else {

            return "False"
        }

    }

}

Основной код из моего viewController.

class ViewController: UIViewController {

    @IBOutlet weak var questionLabel: UILabel!

    @IBOutlet weak var headerLabel: UILabel!

    @IBOutlet weak var leftButtonLabel: UIButton!

    @IBOutlet weak var rightButtonLabel: UIButton!


    var appQuiz = Quiz()


    @IBAction func userAnswerButton(_ sender: UIButton) {

        let userAnswer = sender.currentTitle!
        let questionAnswer = appQuiz.checkAnswer(userAnswer)



        if userAnswer == questionAnswer {

                   print("True")
               }

               else {
                   print("sucks")
               }

        appQuiz.getNextQuestion()

        nextQuestion()

    }


    func nextQuestion(){

        headerLabel.text = appQuiz.getQuestionText()
        questionLabel.text = appQuiz.getQuestionAmount()
        leftButtonLabel.setTitle(appQuiz.getButtonText1(), for: .normal)
        rightButtonLabel.setTitle(appQuiz.getButtonText2(), for: .normal)

    }


}

Моя проблема здесь:

@IBAction func userAnswerButton(_ sender: UIButton) {

        let userAnswer = sender.currentTitle!
        let questionAnswer = appQuiz.checkAnswer(userAnswer)



        if userAnswer == questionAnswer {

                   print("True")
               }

               else {
                   print("sucks")
               }

        appQuiz.getNextQuestion()

        nextQuestion()

    }

1 Ответ

0 голосов
/ 25 октября 2019

Просто сравните sender с кнопкой:

if sender === leftButtonLabel {
   // left clicked
} else {
   // right clicked
}

Относительно вашей структуры Questions, вероятно, было бы лучше сказать, какой ответ является правильным, а не повторять его:

Questions(q: "2 + 2", button1: "4", button2: "6", leftCorrect: true)

Тогда проверка на правильный ответ будет выполняться следующим образом:

let leftClicked = (sender === leftButtonLabel)
let correct = (leftClicked == userQuestions[questionNumber].leftCorrect)

На самом деле, расширяя бит для нескольких ответов, это может выглядеть так:

Questions(q: "2 + 2", possibleAnswers: ["4", "6"], correctIndex: 0]

с помощью

struct Questions {
    let q: String
    let possibleAnswers: [String]
    let correctIndex: Int
}

помещение ваших кнопок в массив:

var answerButtons: [UIButton] {
    return [leftButtonLabel, rightButtonLabel]
}

Задание вопросов:

for (possibleAnswer, button) in zip(question.possibleAnswers, buttons) {
   button.setTitle(possibleAnswer, for: .normal)
}

И проверка правильности ответа:

let buttonIndex = buttons.index(of: sender) ?? 0
let answeredCorrectly = (question.correctIndex == buttonIndex)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...