Как я могу извлечь различные элементы из массива в классе? - PullRequest
0 голосов
/ 13 января 2019

Я создаю приложение для викторины с несколькими категориями. Если пользователь хочет выбрать категорию, он «включит» переключатель для этой категории. Тогда для значения Bool будет установлено значение true, если переключатель включен, и значение false, если он выключен. Это значение Bool будет затем отправлено следующему контроллеру представления, где, если оно имеет истинное значение, будет запущена функция, которая добавит массив вопроса выбранной категории в массив, который содержит массивы выбранных категорий.

В настоящее время так работает мое приложение: У меня есть быстрый файл с именем Question, который создает класс для базовой структуры вопроса. Затем у меня есть другой файл, который называется QuestionBank, который содержит класс, и внутри этого класса находится массив вопросов, которые я создал с помощью класса в файле Question.swift. Оттуда, в контроллере представления для моей игры, я вызываю класс, содержащий массив вопросов, и мой код затем отображает каждый вопрос со всеми его параметрами в порядке их вызова в массиве. Как бы я сделал так, чтобы пользователи могли получить доступ к определенным вопросам или определенной группе вопросов в массиве на основе пользовательского ввода? Я уже пытался создать несколько массивов вопросов и попытаться их вызвать и объединить, чтобы пользователь мог пройти тестирование по обеим категориям, но я по какой-то причине не могу.

Контроллер первого вида:

import UIKit


class ViewControllerTrivia: UIViewController {
    var historySelection = Bool()

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let gameController = segue.destination as! ViewControllerGame
    gameController.isHistorySelected = historySelection
    }

    override func viewDidLoad() {
        super.viewDidLoad()


        // Do any additional setup after loading the view.
    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

    @IBAction func swipeToHome(_ sender: Any) {
        performSegue(withIdentifier: "triviaToHome", sender: ViewControllerHome.self)}

    @IBAction func startGame(_ sender: Any) {
        performSegue(withIdentifier: "triviaToGame", sender: ViewControllerGame.self)
    }

    @IBAction func historySelectionSwitch(_ sender: UISwitch) {

        if (sender.isOn == true) {
            var historySelection = true
            print("on")
        } else {
            var historySelection = false
            print("off")
        }

    }
}

Second View Controller:

import UIKit



class ViewControllerGame: UIViewController {
    var isHistorySelected = Bool()
    @IBOutlet weak var questionCounter: UILabel!
    @IBOutlet weak var scoreLabel: UILabel!
    @IBOutlet weak var progressView: UIView!
    @IBOutlet weak var questionLabel: UILabel!

    //Outlet for Buttons
    @IBOutlet weak var optionA: UIButton!
    @IBOutlet weak var optionB: UIButton!
    @IBOutlet weak var optionC: UIButton!
    @IBOutlet weak var optionD: UIButton!

    var allQuestions = [(Question(questionText: "History: What does FBLA stand for?", choiceA: "A. Formidable Business Learners of America", choiceB: "B. Future Business Learners of America", choiceC: "C.Future Business Leaders of America", choiceD: "D.Fleeting Business Learners Of America", answer: 3)),]
    var historyQuestions = [(Question(questionText: "History: Who was the founder of the FBLA program?", choiceA: "A. Edward D. Miller", choiceB: "B. Conrad N. Hilton", choiceC: "C. Hamden L. Forkner", choiceD: "Elena Daly", answer: 3)) ]

    var questionNumber: Int = 0
    var score: Int = 0
    var selectedAnswer: Int = 0

    func questionSelection() {
        if isHistorySelected == true{
            allQuestions.append(contentsOf: historyQuestions)
        }
    }

    //Making only the top corners of the progress view visible
    func roundProgressCorners() {
    self.progressView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        roundProgressCorners()
        questionSelection()
        updateQuestion()
        updateUI()

        // Do any additional setup after loading the view.
    }

    @IBAction func answerPressed(_ sender: UIButton) {
        if sender.tag == selectedAnswer{
            print("correct")
            score += 1
        }else {
            print("wrong")
        }
        questionNumber += 1
        updateQuestion()

    }
    func updateQuestion(){

        if questionNumber <= allQuestions.count - 1{
            questionLabel.text = allQuestions[questionNumber].question
            optionA.setTitle(allQuestions[questionNumber].optionA, for: UIControl.State.normal)
            optionB.setTitle(allQuestions[questionNumber].optionB, for: UIControl.State.normal)
            optionC.setTitle(allQuestions[questionNumber].optionC, for: UIControl.State.normal)
            optionD.setTitle(allQuestions[questionNumber].optionD, for: UIControl.State.normal)
            selectedAnswer = allQuestions[questionNumber].correctAnswer
            updateUI()

        }else {
            restartQuiz()
            performSegue(withIdentifier: "gameToEndScreen", sender: ViewControllerEndScreen.self)
        }


    }
    func updateUI(){
        scoreLabel.text = "Score: \(score)"
        questionCounter.text = "\(questionNumber + 1)/\(allQuestions.count)"
        progressView.frame.size.width = (view.frame.size.width / CGFloat(allQuestions.count)) * CGFloat(questionNumber + 1)

    }
    func restartQuiz(){
        score = 0
        questionNumber = 0
        updateQuestion()

    }


}

Для окончательного результата я бы предпочел, чтобы пользователь мог выбрать, на какие категории он хотел бы опрашиваться, и тогда приложение будет объединять выбранные категории.

1 Ответ

0 голосов
/ 13 января 2019

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

//1. Create an enum of Question Category
enum QuestionCatgory: String{
    case Sports = "Sports"
    case Politics = "Politicd"
    case Science = "Science"
}

//2. Create a Structure that will hold details about each Question, including its category
struct QuestionsDetail{
    let question: String
    let options: [String]
    let currectOption: Int
    let category: QuestionCatgory

    init(question: String, options: [String], correctOption: Int, category: QuestionCatgory){
        self.question = question
        self.options = options
        self.currectOption = correctOption
        self.category = category
    }
}

class ViewController: UIViewController {

    var questionList: [QuestionsDetail] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        //3. Create data source of your question. Preferably get this data from backend or store it in a Plist or JSON file for better maintainability. In this example its hardcoded
        questionList = createDataSource()

        //4. Call this method to get questions specific for a Category. You can use this array to populate the question in a ViewController. Use delegate to capture user response to maintain the scorecard and other things
        let questionListOfCategory = getQuestionsList(forCategory: .Science)

        print("Questions List for:\n\(questionListOfCategory)\n")

    }

    func getQuestionsList(forCategory category: QuestionCatgory) -> [QuestionsDetail]{

        var questionListOfCategory: [QuestionsDetail] = []

        for question in questionList {
            if question.category.rawValue == category.rawValue{
                questionListOfCategory.append(question)
            }
        }

        return questionListOfCategory
    }

    func createDataSource() -> [QuestionsDetail]{
        let questionDetail1 = QuestionsDetail(question: "Question1", options: ["Option1 A", "Option1 B", "Option1 C", "Option1 D"], correctOption: 2, category: .Sports)
        let questionDetail2 = QuestionsDetail(question: "Question2", options: ["Option2 A", "Option2 B", "Option2 C", "Option2 D"], correctOption: 4, category: .Politics)
        let questionDetail3 = QuestionsDetail(question: "Question3", options: ["Option3 A", "Option3 B", "Option3 C", "Option3 D"], correctOption: 1, category: .Science)
        let questionDetail4 = QuestionsDetail(question: "Question4", options: ["Option4 A", "Option4 B", "Option4 C", "Option4 D"], correctOption: 3, category: .Sports)
        let questionDetail5 = QuestionsDetail(question: "Question5", options: ["Option5 A", "Option5 B", "Option5 C", "Option5 D"], correctOption: 4, category: .Politics)

        var questionList: [QuestionsDetail] = []

        questionList.append(questionDetail1)
        questionList.append(questionDetail2)
        questionList.append(questionDetail3)
        questionList.append(questionDetail4)
        questionList.append(questionDetail5)

        return questionList
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...