2017-03-09 4 views
0

Ich habe ein Problem, während ich das Objekt einer Klasse initialisiere. Was stimmt damit nicht? (Ich kann alle meine Code hochladen, aber es ist groß, wenn erforderlich) enter image description hereInitialisierung des Klassenobjekts swift 3

Edit: My-View-Controller-Code:

import UIKit 

class ViewController: UIViewController{ 

@IBOutlet weak var questionLabel: UILabel! 
@IBOutlet weak var answerStackView: UIStackView! 

// Feedback screen 
@IBOutlet weak var resultView: UIView! 
@IBOutlet weak var dimView: UIView! 
@IBOutlet weak var resultLabel: UILabel! 
@IBOutlet weak var feedbackLabel: UILabel! 
@IBOutlet weak var resultButton: UIButton! 

@IBOutlet weak var resultViewBottomConstraint: NSLayoutConstraint! 
@IBOutlet weak var resultViewTopConstraint: NSLayoutConstraint! 

var currentQuestion:Question? 

let model = QuizModel() 
var questions = [Question]() 

var numberCorrect = 0 

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

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
    super.init(nibName: nil, bundle: nil) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 


func setAll(questionsReturned:[Question]) { 
    /* 
    // Do any additional setup after loading the view, typically from a nib. 

    // Hide feedback screen 
    dimView.alpha = 0 

    // Call get questions 
    questions = questionsReturned 

    // Check if there are questions 
    if questions.count > 0 { 

     currentQuestion = questions[0] 

     // Load state 
     loadState() 

     // Display the current question 
     displayCurrentQuestion() 
    } 
*/ 
print("Called!") 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

Mein QuizModel Code:

import UIKit 
import FirebaseDatabase 


class QuizModel: NSObject { 

override init() { 
    super.init() 
} 

var ref:FIRDatabaseReference? 
var test = [[String:Any]]() 
var questions = [Question]() 
weak var prot:UIPageViewControllerDelegate? 
var first = ViewController() 

func getQuestions(){ 
    getRemoteJsonFile() 
} 


func pars(){ 


    /*let array = test 
    var questions = [Question]() 

    // Parse dictionaries into Question objects 
    for dict in array { 

     // Create question object 
     let q = Question() 

     // Assign question properties 
     q.questionText = dict["question"] as! String 
     q.answers = dict["answers"] as! [String] 
     q.correctAnswerIndex = dict["correctIndex"] as! Int 
     q.module = dict["module"] as! Int 
     q.lesson = dict["lesson"] as! Int 
     q.feedback = dict["feedback"] as! String 

     // Add the question object into the array 
     questions += [q] 
    } 
    */ 

    //Protocol setAll function 
    first.setAll(questionsReturned: questions) 
} 

func getRemoteJsonFile(){ 

    ref = FIRDatabase.database().reference() 

    ref?.child("Quiz").observeSingleEvent(of: .value, with: { (snapchot) in 

     print("hey") 
     let value = snapchot.value as? [[String:Any]] 
     if let dict = value { 
      self.test = dict 
      self.pars() 
     } 
    }) 
} 

Das ist nicht mein aller Code, aber ich denke, das ist der wichtigste Teil. In QuizModel code ich meine Code von JSON-Datei bekommen bekommen, um Daten von Firebase zu bekommen, so können Sie Namen von Funktionen wie 'getRemoteJSONFile' und in Parser-Funktion Parsing JSON sehen, aber es ist kein Problem meines Problems Ich denke,

+0

Wir müssen mehr von Ihrem Code sehen. Nicht alles, aber mehr davon. – BallpointBen

+0

ok ich werde meinen Beitrag bearbeiten –

+0

Bitte zeigen 'QuizModel' Code, es scheint das Problem ist in seinem Initialisierer –

Antwort

2

Es sieht so aus, als ob Sie versuchen, eine Konstante zu initialisieren, bevor Sie den ViewController initialisiert haben. Sie müssen es zu var machen und es in viewDidLoad (oder einer anderen Lebenszyklusmethode) initialisieren, oder es zu lazy var machen und es initialisieren zu der Zeit, dass es zum ersten Mal zugegriffen wird.

2

Das Problem läuft darauf hinaus, die folgenden:

class ViewController ... { 
    let model = QuizModel() 
} 

class QuizModel ... { 
    var first = ViewController() 
} 

Die Variableninitialisierungen während Objektinitialisierung aufgerufen werden. Wenn Sie eine Instanz von ViewController erstellen, wird eine Instanz von QuizModel erstellt, aber durch die Initialisierung wird eine ViewController erstellt, die wiederum eine neue QuizModel und so weiter erstellt.

Dieser unendliche Zyklus wird früher oder später Ihre Anwendung zum Absturz bringen (ein sogenannter "Stack Overflow").

Es ist wahrscheinlich ein Fehler auf Ihrer Seite. Vielleicht möchten Sie den ersten Controller an QuizModel übergeben, zum Beispiel?

class ViewController ... { 
    lazy var model: QuizModel = { 
     return QuizModel(viewController: self) 
    } 
} 

class QuizModel ... { 
    weak var viewController: ViewController? 

    override init(viewController: ViewController) { 
     self.viewController = viewController 
    } 
} 

Auch stellen Sie sicher, dass Sie den Besitz Zyklen nicht zu schaffen sind (deshalb habe ich weak verwendet haben).

Im Allgemeinen ist es eine gute Idee, Ihre Modellklassen und Ihre UI-Klassen streng zu trennen. Sie sollten View-Controller (oder Controller-Delegat für Seitenansicht) nicht an Ihre Modellklasse übergeben. Wenn Sie mit Ihrem Controller kommunizieren müssen, erstellen Sie einen dedizierten Delegaten dafür.