2017-05-30 9 views
0

私は循環的な問題があります。 UIViewカスタムイニシャライザ(またはこれらのラインに沿ったもの)の目的のCバージョンを参照してください:すぐにビューモールドコールバックを使用したUIViewの初期化

-(instancetype)initWithFrame:(CGRect)frame data:(MyDataType) myData{ 
    self = [super initWithFrame:CGRectMake(0, 0, 150, 200)]; 
    if(self){ 
     self.viewModel = [[MyViewModel alloc] initwith:self andWithData:myData]; 
    } 
    return self; 
} 

これはすぐに苦しみになります。次を使用している場合:

init(_ myData: MyDataModel){ 
     viewModel = MyViewModel(view:self,data:myData) 
     super.init(frame:CGRect.zero) 
    } 

を今ここで問題が出てくるところです:

  1. 私はでsuper.init(フレーム:CGRect.zero)を呼び出す場合は、最初、私はの線に沿ってエラーが出ますビューモデルが設定されていません。
  2. 私はビューモデルの初期化後にスーパーを呼び出す場合は、明らかに誤りをtheresの自己

存在していないので、次に、このあります:

required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
  1. 私はどのように初期化するかは、私がデータを渡していない場合、モデルを表示しますか?
  2. 私はまた、例えば、フレームの問題を処理する方法を知っていただきたいと思います:

私はこのようなinitメソッドがある場合:MYVIEW:

override init(frame: CGRect) { 
     super.init(frame: frame) 
} 

を私はこのようなオブジェクトをインスタンス化することができます()と私はフレームを渡す必要はありませんし、通常はフレームが渡される必要はありません。なぜなら、OS自体がソートされるからです。しかしと:

init(_ myData: MyDataModel){ 
      viewModel = MyViewModel(view:self,data:myData) 
      super.init(frame:CGRect.zero) 
     } 

は今、私がCGRect.zero選択したフレームを使用するように私を必要としますが、これは正しい方法は何ですか?

答えて

0

letの代わりにvarを使用してください。 UIViewの初期化にCGRect.zeroを使用しないでください。

import UIKit 

class MyDataModel {} 

class MyViewModel { 
    init(view: UIView, data: MyDataModel) { } 
} 

class SomeView: UIView { 

    fileprivate var viewModel: MyViewModel! 

    init(_ myData: MyDataModel){ 
     super.init(frame: CGRect(x: 0.0, y: 0.0, width: 0.1, height: 0.1)) 
     viewModel = MyViewModel(view: self, data: myData) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     /** 
      You can set viewModel somehow or call fatal error 
      fatalError("Couldn't Be Created Through The Stroryboard") 
     */ 
    } 

    func someMethodWithViewModel() { 
     guard let viewModel = viewModel else { return } 
     /* Do whatever you need with viewModel */ 
    } 
} 
関連する問題