2017-07-23 7 views
1

Ich entwickle eine Quiz-App und sobald Sie eine Frage richtig beantworten, wechselt der View-Controller zu einem anderen View-Controller, der den Benutzer darüber informiert, dass die Frage richtig ist und auf eine Schaltfläche klickt, um fortzufahren. Wenn ich jedoch den Simulator starte, werden die Daten nicht gespeichert, sobald sie zum nächsten View-Controller weitergeleitet werden. Sobald der Benutzer eine Frage richtig beantwortet, möchte ich, dass die Frage nicht erneut gestellt wird. Sobald Sie jedoch eine Frage richtig beantworten und zum View-Controller wechseln, der Sie auffordert, einen fortzusetzen, drücken Sie die Taste, um zum ursprünglichen View-Controller zu wechseln. Der Benutzer erhält dann Fragen, die er bereits beantwortet hat. Wie kann ich dafür sorgen, dass der View-Controller den Benutzer auffordert, die Daten vom ursprünglichen View-Controller zu speichern, um sicherzustellen, dass dem Benutzer keine Fragen gestellt werden, die er bereits richtig beantwortet hat?Wie speichere ich Daten zwischen View Controllern?

Hier ist mein Code für das Original-View-Controller:

import UIKit 

class ViewController: UIViewController { 

var questionList = [String]() 

func randomQuestion() { 



    //random question 
    if questionList.isEmpty { 
     questionList = Array(QADictionary.keys) 



    } 




    let rand = Int(arc4random_uniform(UInt32(questionList.count))) 
    questionLabel.text = questionList[rand] 


    //matching answer values to go with question keys 
    var choices = QADictionary[questionList[rand]]! 

     questionList.remove(at: rand) 



    //create button 
     var button:UIButton = UIButton() 

    //variables 
    var x = 1 
    rightAnswerBox = arc4random_uniform(4)+1 


     for index in 1...4 
     { 



      button = view.viewWithTag(index) as! UIButton 

      if (index == Int(rightAnswerBox)) 
      { 
       button.setTitle(choices[0], for: .normal) 

      } 

      else { 
       button.setTitle(choices[x], for: .normal) 
       x += 1 

      } 


      randomImage() 

     } 
    } 


let QADictionary = ["Who is Thor's brother?" : ["Atum", "Loki", "Red Norvell", "Kevin Masterson"], "What is the name of Thor's hammer?" : ["Mjolinr", "Uru", "Stormbreaker", "Thundara"], "Who is the father of Thor?" : ["Odin", "Sif", "Heimdall", "Balder"]] 



//wrong view segue 
func wrongSeg() { 

    performSegue(withIdentifier: "wrongViewSegue", sender: self) 

} 

//proceed screen 
func rightSeg() { 

    performSegue(withIdentifier: "rightSeg", sender: self) 
} 

//variables 
var rightAnswerBox:UInt32 = 0 
var index = 0 



//Question Label 
@IBOutlet weak var questionLabel: UILabel! 

//Answer Button 
@IBAction func buttonAction(_ sender: AnyObject) { 

if (sender.tag == Int(rightAnswerBox)) 


{ 
    print ("Correct!") 
} 

else if (sender.tag != Int(rightAnswerBox)) { 

    wrongSeg() 
print ("Wrong!") 
    questionList = [] 
    } 

    randomQuestion() 

} 

override func viewDidAppear(_ animated: Bool) 
{ 
randomQuestion() 


} 




//variables 
var seconds = 15 
var timer = Timer() 




override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 




} 

Hier Code View-Controller segues es einmal Sie richtig eine Frage beantworten:

import UIKit 

class CorrectView: UIViewController { 


//correct answer label 
@IBOutlet weak var correctLbl: UILabel! 

//background photo 
@IBOutlet weak var backgroundImage: UIImageView! 

func backToQuiz() { 

    performSegue(withIdentifier: "continueSeg", sender: self) 
} 

@IBAction func `continue`(_ sender: Any) { 

    backToQuiz() 
} 



override func viewDidLoad() { 
    super.viewDidLoad() 

} 
+0

Mit segues für Frage Seiten bestehen bleiben, ist falsch. Wenn Sie 20 Fragen haben, würden Sie 20 verschiedene View-Controller für jede Frage haben. Bekomme ich es richtig? –

+0

nein alle meine Fragen sind in einem Array in einem View-Controller gespeichert –

+0

verwenden Sie einfach zwei Arrays, die das Ergebnis speichert welche Frage richtig beantwortet wird und welche falsch und während des Endergebnisses vergleichen Sie einfach Ihre beiden neuen Array mit ersten Frage-Array oder wenn Sie wollen nur Punkte als Ergebnis deklarieren, verwenden Sie einfach das Array der korrekten Antwortliste –

Antwort

0

Wenn Sie zuvor gefragt speichern möchten Fragen nur für die aktuelle Instanziierung der App, könnten Sie ein Singleton erstellen. Dies beinhaltet das Erstellen einer separaten Klasse mit einem Feld, das die zuvor gestellten Fragen enthält.

Wenn Sie bereits gestellte Fragen speichern möchten, nachdem die App beendet wurde, verwenden Sie Core Data oder Benutzer-Standardeinstellungen.

2

Im Folgenden sind die Möglichkeiten, in denen Sie Daten speichern und weitergeben an die viewController.:-

  • benutzerdefinierten Delegaten erstellen und Daten von einem View-Controller zu anderen senden. Nach dem Beenden der App bleiben die Daten jedoch nicht erhalten.

  • Die zweite Option besteht darin, das Singleton zu erstellen, aber nur, wenn es
    erforderlich ist, wo Sie auf die Daten überall aus Ihrem Code zugreifen müssen.

  • dritte Option ist die Verwendung UserDefaults oder Core-Daten aber nur, wenn Sie wollen

Verwandte Themen