перемещение данных из модели в целевой ViewController с помощью segue - PullRequest
0 голосов
/ 02 сентября 2018

Я новичок в Swift и программировании в целом. Я создаю приложение викторины. Приложение использует TopicsViewController для выбора темы и перехода к QuestionsViewController. Вопросы по различным темам хранятся в виде отдельного файла объектов Swift. Я хотел бы выбрать файл Вопроса Topic1, когда я нажимаю кнопку topic1 в TopicsViewController, чтобы перейти в QuestionsViewController. Я хотел бы знать, как я могу выбрать конкретный файл вопросов QuestionBank1 / QuestionBank2, когда я выбираю конкретную тему при переходе к QuestionViewController? Панель навигации Main.Storyboard импорт UIKit Класс TopicsViewController: UIViewController, returnToTopicVCDelegate {

        func goToTopicVC() {
        }

        override func viewDidLoad() {
            super.viewDidLoad()
        }

        @IBAction func goToQuestionsVCWhenPressed(_ sender: UIButton) {
            performSegue(withIdentifier: "segueToQuestionVC", sender: self)
        }

          override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "segueToQuestionVC" {
                let quizVC = segue.destination as! QuizViewController
                quizVC.delegate = self
        }
    }
    }

    import UIKit
    import QuartzCore

    protocol returnToTopicVCDelegate{
        func goToTopicVC()
    }

    class QuizViewController: UIViewController {

        var delegate : returnToTopicVCDelegate?

        //outlet for the question label and image view
        @IBOutlet weak var questionLabel: UILabel!
        @IBOutlet weak var questionImageView: UIImageView!
        //outlet for the buttons
        @IBOutlet weak var optionAButton: UIButton!
        @IBOutlet weak var optionBButton: UIButton!
        @IBOutlet weak var optionCButton: UIButton!
        @IBOutlet weak var optionDButton: UIButton!
        @IBOutlet weak var optionEButton: UIButton!
        //outlets for the progress
        @IBOutlet weak var questionCounter: UILabel!
        @IBOutlet weak var scoreLabel: UILabel!

        var allQuestions = QuestionBank()
        var selectedAnswer : Int = 0 // answer selected by the subject
        var questionNumber: Int = 0
        var score: Int = 0

    // functions executed after an answer is picked 
        @IBAction func answerPressed(_ sender: UIButton) {
            if sender.tag == selectedAnswer {
                print("correct answer")
                sender.backgroundColor = .green
                score += 1
            } else {
                print("wrong")
                sender.backgroundColor = .red
                print("\(allQuestions.list[questionNumber].correctAnswer)")
                //the following two lines change the right answer button to green using the tag value of the button
                let correctAnswerButton = view.viewWithTag(selectedAnswer) as? UIButton
                correctAnswerButton?.backgroundColor = UIColor.green
            }
        }

        @IBAction func GoToNextQuestion(_ sender: UIButton) {
            questionNumber += 1
            nextQuestion()
        }

    // selects a new questions and updates the score

        func nextQuestion(){
            if questionNumber <= allQuestions.list.count - 1 {
            questionLabel.text = allQuestions.list[questionNumber].question
            questionImageView.image = UIImage(named: (allQuestions.list[questionNumber].questionImage))
            optionAButton.setTitle(allQuestions.list[questionNumber].optionA, for: UIControlState.normal)
            optionBButton.setTitle(allQuestions.list[questionNumber].optionB, for: UIControlState.normal)
            optionCButton.setTitle(allQuestions.list[questionNumber].optionC, for: UIControlState.normal)
            optionDButton.setTitle(allQuestions.list[questionNumber].optionD, for: UIControlState.normal)
            optionEButton.setTitle(allQuestions.list[questionNumber].optionE, for: UIControlState.normal)
                      selectedAnswer = allQuestions.list[questionNumber].correctAnswer
                updateUI()
            } else {
                let alert = UIAlertController(title: "Great!", message: "Do you want to start over?", preferredStyle: .alert)
                let restartAction = UIAlertAction(title: "Restart", style: .default) {(UIAlertAction) in
                    self.restartQuiz()
                }
                alert.addAction(restartAction)
                present(alert, animated: true, completion: nil)
            }
        }


        func updateUI(){
            scoreLabel.text = "score: \(score)"
            questionCounter.text = "\(questionNumber + 1)/\(allQuestions.list.count)"
        }

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


        @IBAction func goBackToTopicsVC(_ sender: Any) {
            delegate?.goToTopicVC()
            dismiss(animated: true, completion: nil)
        }
    }

1 Ответ

0 голосов
/ 02 сентября 2018

Вы можете использовать следующие шаги:

1 - добавьте переход из TopicsViewController в QuestionsViewController и задайте переход "Имя идентификатора" из инспектора атрибутов.

2- Добавьте переменную в QuestionsViewController для темы, назовите ее «topicType».

3 - Переопределите нижеприведенную функцию в TopicsViewController и отправьте название темы с помощью segue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "Identifier Name" {
            if let destinationviewController = segue.destination as? QuestionsViewController , let buttonPressed = sender as? UIButton {
                destinationviewController.topicType = buttonPressed.currentTitle!  
            }
        }
}

4- Для каждой кнопки в TopicsViewController получите действие кнопки и введите в нем следующую функцию:

@IBAction func topicButton(_ sender: UIButton) {

            performSegue(withIdentifier: "Identifier Name", sender: nil)

}

Надеюсь, это поможет вам.

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