2017-08-29 11 views
0

MVVMを使用していて、コントローラのinitのviewControllerにviewModelを割り当てたいとします。私はそうのようにこれを達成するだろうと思った:Controller InitにviewModelを割り当てる?

class LoginViewController: UIViewController, UITextFieldDelegate { 

    init(loginViewModel: LoginViewModel) { 
     self.loginViewModel = loginViewModel 
    } 

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

しかし、私はエラーを取得する:

Super.init isn't called on all paths before returning from initializer

はこれが取るべき正しい経路ではないですか?また、オブジェクトを必要とするときにviewModelを正しく初期化するにはどうすればよいですか?まずネットワーク要求を実行する必要がありますか?空のオブジェクトインスタンスでInit?

おかげ

編集:これは、イムは、現在のベストプラクティスとして

initWithViewAndViewModel:(loginView: LoginView, loginViewModel: LoginViewModel) { 
     super.init() 
     self.loginView = loginView 
     self.loginViewModel = loginViewModel 
    } 
+0

をあなたはスーパーに必要:

convenience init() { self.init(loginViewModel: nil) } init(loginViewModel: LoginViewModel?) { self.loginViewModel = loginViewModel super.init(nibName: nil, bundle: nil) } 

それが役立つかもしれない、このリンクを経由して行ってくださいあなたのviewcontroller initの.init。 – koropok

+0

loginViewModelを割り当てる前に 'super.init()'を呼び出します。 –

+0

私はそれを試みたが、私は得る...スーパークラス 'UIViewController'の指定されたイニシャライザを呼び出さなければならない – jackdm

答えて

1

をしようとするものである、

ステップ1:

required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

ステップ2:

init(loginViewModel : LoginViewModel) { 
     super.init(nibName: nil, bundle: nil) 
     initWithModel:(loginViewModel: LoginViewModel) 
    } 

ステップ3:それが動作する場合は、これを追加することinitWithModel機能を実装

+0

ありがとうございます。どこでinitWithModelを宣言する必要がありますか? VCの体でちょうど?現在「期待される宣言」がスローされている – jackdm

+0

こんにちはJackdm、私は答えを更新しました。 – Pebby

関連する問題