UIView在swift中使用viewModel回调初始化
Posted
技术标签:
【中文标题】UIView在swift中使用viewModel回调初始化【英文标题】:UIView initialization with viewModel callback in swift 【发布时间】:2017-05-30 15:21:01 【问题描述】:我遇到了一些循环问题。请参阅 UIView 自定义初始化程序的目标 c 版本(或类似的内容):
-(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(frame:CGRect.zero),则会收到一个错误,即未设置视图模型。
如果我在视图模型初始化后调用super,那么显然有错误,因为self不存在
然后是这样的:
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
-
如果不传入数据,如何初始化视图模型?
我也想知道如何处理框架问题,例如:
如果我有这样的 init 方法:
override init(frame: CGRect)
super.init(frame: frame)
我可以像这样实例化对象:myView(),我不需要传入帧,我通常不需要传入帧,因为操作系统会自行排序。但是:
init(_ myData: MyDataModel)
viewModel = MyViewModel(view:self,data:myData)
super.init(frame:CGRect.zero)
现在需要我使用框架,我选择了CGRect.zero
,但这是正确的方式吗?
【问题讨论】:
【参考方案1】:使用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 */
【讨论】:
以上是关于UIView在swift中使用viewModel回调初始化的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift:无需调整大小即可旋转和缩放 UIView
如何使用 Swift 3 在 UIView 中覆盖 requiresConstraintBasedLayout?
在 UIScrollView (Swift) 中使用动态内容调整 UiView 高度