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:ViewModel 应该是结构还是类?

如何使用 Swift 3 在 UIView 中覆盖 requiresConstraintBasedLayout?

在 UIScrollView (Swift) 中使用动态内容调整 UiView 高度

UIButton 未使用 Swift 在 UIView 中显示

如何在 Swift 中使用 SnapKit 使 UIView 具有相等的宽度和高度?