2017-03-09 17 views
0

あるクラスのオブジェクトを初期化するときに問題があります。それは何が間違っていますか? (私はすべての私のコードをアップロードすることができますが、必要であれば、それは大きいです)enter image description hereクラスオブジェクトの初期化を早める3

編集: 私のビューコントローラコード:

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. 
} 

マイQuizModelコード:

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() 
     } 
    }) 
} 

これは私ではありませんすべてのコードが、私はそれが最も重要な部分だと思います。 QuizModelコードでは、jsonファイルをfirebaseから取得するコードを作成しているので、「getRemoteJSONFile」やjsonを解析する解析関数の名前を見ることができますが、私の考える問題ではありません。

+0

あなたのコードをもっと見る必要があります。それのすべてではなく、それ以上のもの。 – BallpointBen

+0

ok投稿を編集します –

+0

'QuizModel'コードを表示してください、それは初期化プログラムの中に問題があるようです –

答えて

2

これは、それが住んでいるviewControllerを初期化する前に定数を初期化しようとしているようです。varにしてviewDidLoad(または別のライフサイクルメソッド)で初期化するか、lazy varにして初期化しなければなりません最初にアクセスした時点で

2

問題は、次のように要約:

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

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

変数初期化子は、オブジェクトの初期化時に呼び出されます。 ViewControllerのインスタンスを作成すると、QuizModelのインスタンスが作成されますが、初期化によってViewControllerが作成され、新しいQuizModelなどが作成されます。

この無限のサイクルで、アプリケーションがクラッシュすることがあります(いわゆる「スタックオーバーフロー」)。

あなたの側に多分間違いがあります。初期コントローラをQuizModelに渡したいとしますか? (私はweakを使用している理由です)

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

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

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

はまた、あなたが所有サイクルを作成していないことを確認してください。

一般に、モデルクラスとUIクラスを厳密に分離することをお勧めします。ビューコントローラ(またはページビューコントローラデリゲート)をモデルクラスに渡すべきではありません。コントローラと通信する必要がある場合は、専用のデリゲートを作成します。

関連する問題