【问题标题】:UIView initialization with viewModel callback in swiftUIView在swift中使用viewModel回调初始化
【发布时间】: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)
    }

现在问题出现了:

  1. 如果我先调用 super.init(frame:CGRect.zero),则会收到一个错误,即未设置视图模型。
  2. 如果我在视图模型初始化后调用super,那么显然有错误,因为self不存在

然后是这样的:

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

如果我有这样的 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,但这是正确的方式吗?

【问题讨论】:

    标签: ios swift uiview


    【解决方案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 */
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2014-11-10
      • 2017-11-22
      相关资源
      最近更新 更多