的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)
}
现在这里是问题拿出其中:
- 如果我调用super.init(帧:CGRect.zero)第一,然后我得到的线沿线的一个错误未建立视图模型。
- 如果我调用视图模型初始化后超的话,显然那里有一个错误,因为自己不存在
再有是这样的:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
- 如何初始化查看模型,如果我没有传入数据?
- 我也想知道如何处理框架的问题,例如:
如果我有一个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 */
}
}