的UIView初始化中迅速

问题描述:

我有一点圆形问题。见一个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. 如果我调用视图模型初始化后超的话,显然那里有一个错误,因为自己不存在

再有是这样的:

required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
  1. 如何初始化查看模型,如果我没有传入数据?
  2. 我也想知道如何处理框架的问题,例如:

如果我有一个init方法是这样的:

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

我可以实例化这样的对象:MyView的(),我不需要在一帧通过,我通常并不需要在一个框架,因为OS搞清楚了通过。然而,随着:

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

现在要求我使用,我选择CGRect.zero一个框架,但是这是正确的方法是什么?

使用var,而不是let。并避免使用CGRect.zero初始化UIView的年代:

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 */ 
    } 
}