Я создаю приложение для викторины с несколькими категориями. Если пользователь хочет выбрать категорию, он «включит» переключатель для этой категории. Тогда для значения 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()
}
}
Для окончательного результата я бы предпочел, чтобы пользователь мог выбрать, на какие категории он хотел бы опрашиваться, и тогда приложение будет объединять выбранные категории.