ios – Swift quiz app how to go on the next question?

0
112


I am trying to make quiz app using the API, I can show a question and answers but I can’t go to next questions. When I click on the right option, I want the scoreboard to increase and move to the new question, and when I click on the wrong options, I want the scoreboard to go to the new question without changing. how can I do?

Quiz Manager

import Foundation

protocol quizManagerDelegate {
    func didUpdateQuiz(_ Quizmanager: QuizManager ,quiz: QuizModel)
}

struct QuizManager {
    
    var delegate: quizManagerDelegate?
    
    func performRequest(){
        
         let urlString = "https://opentdb.com/api.php?amount=15&type=multiple"        
        if let url = URL(string: urlString){
            
            let session = URLSession(configuration: .default)
            
            let task = session.dataTask(with: url) { data, response, error in

                if error != nil {
                    print(error!)
                    return
                }
                if let safeData = data{
                                        
                    if let quiz = self.parseJSON(quizdata: safeData){
                        delegate?.didUpdateQuiz(self, quiz: quiz)
                        

                    }
                    
                }
            }
            task.resume()
        }
    }
    
    func handle(data: Data?, response: URLResponse?, error: Error?) -> Void {
        
        
    }
    
    func parseJSON(quizdata: Data) -> QuizModel? {
        
        let decoder = JSONDecoder()
        
        do{
            let decodedData = try decoder.decode(Welcome.self, from: quizdata)
            
            let correct = decodedData.results?[0].correct_answer ?? "error"
            let quest = decodedData.results?[0].question ?? "error"
            let incorrect = decodedData.results?[0].incorrect_answers ?? ["error"]
            
            let question = QuizModel(correctAnswer: correct, question: quest, falseAnswer: incorrect)

         
            return question
        } catch {
            print(error)
            return nil
        }
    }
    
    func nextQuestion(){
 
    }
}

QuizData

import Foundation


 // MARK: - Welcome
 struct Welcome: Codable {
 let results: [Result]?
 }
 
 // MARK: - Result
 struct Result: Codable {
     
 let category: String?
 let question, correct_answer: String?
 let incorrect_answers: [String]?
 }

QuizModel

import Foundation


 // MARK: - Welcome
 struct Welcome: Codable {
 let results: [Result]?
 }
 
 // MARK: - Result
 struct Result: Codable {
     
 let category: String?
 let question, correct_answer: String?
 let incorrect_answers: [String]?
 }

ViewController

import UIKit

class ViewController: UIViewController {
 
    
    @IBOutlet weak var ScoreLabel: UILabel!
    @IBOutlet weak var ChoiceButton4: UIButton!
    @IBOutlet weak var ChoiceButton3: UIButton!
    @IBOutlet weak var ChoiceButton2: UIButton!
    @IBOutlet weak var ChoiceButton1: UIButton!
    @IBOutlet weak var QuestionTextView: UITextView!
    
    var quizMangager = QuizManager()
    var score = 0
    
    var theQuiz: QuizModel?
   
    @IBAction func OptionsButtonPressed(_ sender: UIButton) {
        
        guard let thisQuiz = theQuiz,
                  let btnTitle = sender.currentTitle
            else { return }
            
            if btnTitle == thisQuiz.correctAnswer {
                score += 1
                ScoreLabel.text = "SCORE: \(score)"
                
                sender.setTitleColor(.systemGreen, for: [])
            } else {
                sender.setTitleColor(.systemRed, for: [])
            }
        
        Timer.scheduledTimer(timeInterval: 0.35, target: self, selector: #selector(updateUI), userInfo: nil, repeats: false)
        
    }
    
    @objc func updateUI() {
    
        
        
    }
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        QuestionTextView.layer.cornerRadius = 15
        quizMangager.delegate = self
        quizMangager.performRequest()
    }

}

extension ViewController : quizManagerDelegate{
    func didUpdateQuiz(_ Quizmanager: QuizManager, quiz: QuizModel) {
        DispatchQueue.main.async { [self] in
            
            self.theQuiz = quiz

            self.QuestionTextView.text = quiz.question

            var allOptions = []
            allOptions.append(quiz.falseAnswer[0])
            allOptions.append(quiz.falseAnswer[1])
            allOptions.append(quiz.falseAnswer[2])
            allOptions.append(quiz.correctAnswer)
            
            let generatedValue = Array(allOptions.shuffled().prefix(4))
            print(generatedValue)
            print(quiz.correctAnswer)

            ChoiceButton1.setTitle(generatedValue[0] as? String, for: .normal)
            ChoiceButton2.setTitle(generatedValue[1] as? String, for: .normal)
            ChoiceButton3.setTitle(generatedValue[2] as? String, for: .normal)
            ChoiceButton4.setTitle(generatedValue[3] as? String, for: .normal)
        }
    }
}