WWDC22 SALE: Save 50% on all my Swift books and bundles! >>

Day 35 Challenge: How to clear the Textfield every time you get a new question?

Forums > 100 Days of SwiftUI

Hi all, how to clear the text field everytime you get a new question and click the textfield to enter a value? I have tried initiate a UITextChecker, but not sure how to put that textChecker = UITextChecker() instance to use in my current code: The clearButtonMode only works on an instantialized textfield.

Other than that, if I understand the prompt correctly, the rest of the program works fine, and can serve as a reference for those who got stuck a bit.

import SwiftUI

struct Question : Hashable {
    var title : String = ""
    var num1 : Int
    var num2 : Int
    var correctAnswer : Int {
        num1 * num2
    }
}

struct ContentView: View {

    @State private var practiceNumber = 7 // 2...12
    @State private var numberOfQuestions = 10
    @State private var userScore = 0
    @State private var totalAnswered = 0
    @State private var questionsList = [Question] () // initialize an empty array of questions
    @State private var userAnswer = 0
    @State private var showingScore = false
    @State private var gameFinished = false
    @State private var scoreTitle = ""
    @State private var q : Question = Question(title: "", num1: 0, num2: 0)

    @FocusState private var isFocused : Bool

    var body: some View {
        NavigationView {
            Form {

                Section("Maximum number for multiplication table") {
                    Stepper("\(practiceNumber)", value: $practiceNumber, in: 2...12)
                }

                Section("How many questions to practice") {
                    Stepper("\(numberOfQuestions) Questions", value: $numberOfQuestions, in: 5...20, step: 5)
                }

                // put some animation here to make the change obvious
                Section {
                    Button("Get Your Question") {
                        generateQuestion(max: practiceNumber, number: numberOfQuestions)
                    }
                    Text("\(q.title)").font(.largeTitle).foregroundColor(.purple).animation(.default)
                }

                Section("Your Answer is: ") {
                    TextField("Enter your answer: ", value: $userAnswer, format: .number).keyboardType(.numberPad).focused($isFocused)
                }

                Section {
                    Button("Check Your Answer") {
                        checkAnswer()
                    }
                }

                VStack {
                    HStack {
                        Text("Your score is: ")
                        Spacer()
                        Text("\(userScore)")
                    }

                    HStack {
                        Text("Total questions answered: ")
                        Spacer()
                        Text("\(totalAnswered)")
                    }
                }

                Section {
                    HStack {
                        Spacer()
                        Button("Restart") {
                            gameFinished = true
                        }
                        Spacer()
                    }
                }

            }
            .navigationTitle("Edutainment").font(.headline)
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItemGroup(placement: .keyboard) {
                    Button("Done") {
                        isFocused = false
                    }
                }
            }
            .alert(scoreTitle, isPresented: $showingScore) {
                Button("Next", action: nextQuestion)
            } message: {
                Text("Your score is \(userScore)")
            }

            .alert("You have finished all questions", isPresented: $gameFinished) {
                Button("Restart", action: reset)
                Button("Cancel", role: .cancel) {}
            } message: {
                Text("Your final score is \(userScore)")
            }

        }
    }

    // generate a random question from the full Question List. Populate the list first
    func generateQuestion(max practiceNumber : Int, number numberOfQuestions : Int) {

        for _ in 1...numberOfQuestions {
            let firstNumber = Int.random(in: 2...practiceNumber)
            let secondNumber = Int.random(in: 2...practiceNumber)
            let title = "\(firstNumber) * \(secondNumber) = ?"
            questionsList.append(Question(title: title, num1: firstNumber, num2: secondNumber))
        }

        q = questionsList.randomElement() ?? Question(title: "Nothing", num1: 0, num2: 0)
    }

    // basically the same from GuessTheFlag
    func checkAnswer() {

        if totalAnswered == (numberOfQuestions - 1) {
            gameFinished = true
        }
//        guard let result = questionsList.randomElement() else { return }
        if userAnswer == q.correctAnswer {
            scoreTitle = "Correct"
            userScore += 1
        }

        else {
            scoreTitle = "Wrong"
            userScore += 0
        }

        totalAnswered += 1
        showingScore = true
    }

    func nextQuestion() {
        generateQuestion(max: practiceNumber, number: numberOfQuestions)
    }

    func reset() {
        scoreTitle = ""
        userScore = 0
        totalAnswered = 0
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

   

Save 50% in my Black Friday sale.

SAVE 50% To celebrate WWDC22, all our books and bundles are half price, so you can take your Swift knowledge further without spending big! Get the Swift Power Pack to build your iOS career faster, get the Swift Platform Pack to builds apps for macOS, watchOS, and beyond, or get the Swift Plus Pack to learn advanced design patterns, testing skills, and more.

Save 50% on all our books and bundles!

Sponsor Hacking with Swift and reach the world's largest Swift community!

Reply to this topic…

You need to create an account or log in to reply.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.