gpt4 book ai didi

ios - UIView 在 swift 中使用 viewModel 回调进行初始化

转载 作者:行者123 更新时间:2023-11-30 12:25:33 29 4
gpt4 key购买 nike

我遇到了一些循环问题。请参阅 UIView 自定义初始化程序的 Objective 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) ,则会收到一条错误消息,表示未设置 View 模型。
  2. 如果我在 View 模型初始化后调用 super,那么显然会出现错误,因为 self 不存在

然后是这样的:

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
  1. 如果不传入数据,如何初始化 View 模型?
  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 但这是正确的方法吗?

最佳答案

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

关于ios - UIView 在 swift 中使用 viewModel 回调进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44266134/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com