如何在SwiftUI中拥有一个类/模型的多个实例?
问题的答案是肯定的。让我们详细介绍一下这个例子:如何在SwiftUI中拥有一个类/模型的多个实例?,swiftui,Swiftui,问题的答案是肯定的。让我们详细介绍一下这个例子: TextField查看: struct CreateNewCard: View { @ObservedObject var viewModel: CreateNewCardViewModel var body: some View { TextField("placeholder...", text: $viewModel.definition) .foregroundC
TextField
查看:
struct CreateNewCard: View {
@ObservedObject var viewModel: CreateNewCardViewModel
var body: some View {
TextField("placeholder...", text: $viewModel.definition)
.foregroundColor(.black)
}
}
视图模型:
class CreateNewCardViewModel: ObservableObject {
@Published var id: Int
@Published var definition: String = ""
}
主要观点:
struct MainView: View {
@State var showNew = false
var body: some View {
ForEach(0...10, id: \.self) { index in // <<<---- this represents the id
Button(action: { showNew = true }, label: { Text("Create") })
.sheet(isPresented: $showNew, content: {
// now I have to pass the id, but this
// leads to that I create a new viewModel every time, right?
CreateNewCard(viewModel: CreateNewCardViewModel(id: index))
})
}
}
struct MainView:View{
@状态变量showNew=false
var body:一些观点{
ForEach(0…10,id:\.self){index in/这是我见过的最奇怪的编码方式,我是如何使它工作的:
我想说的是,你们可以把它作为学习和测试的工具,但对于真正的应用程序来说,这并不是一个好的计划,不管怎样,让它工作起来对我来说是多么有趣
我认为您的代码中有错误的计划,是否要创建该类的多个实例?因为在ForEach中,您将创建10个不同的CreateNewCardViewModel实例。是否要这样做?是的,这就是想法。每个视图都应该有一个处理特定元素的viewModel(例如由id
标识).非常感谢!我想我已经意识到我对MVVM模式有一个很大的误解。。。
import SwiftUI
struct ContentView: View {
var body: some View {
MainView()
}
}
class CreateNewCardViewModel: ObservableObject, Identifiable, Equatable {
init(_ id: Int) {
self.id = id
}
@Published var id: Int
@Published var definition: String = ""
@Published var show = false
static func == (lhs: CreateNewCardViewModel, rhs: CreateNewCardViewModel) -> Bool {
return lhs.id == rhs.id
}
}
let arrayOfModel: [CreateNewCardViewModel] = [ CreateNewCardViewModel(0), CreateNewCardViewModel(1), CreateNewCardViewModel(2),
CreateNewCardViewModel(3), CreateNewCardViewModel(4), CreateNewCardViewModel(5),
CreateNewCardViewModel(6), CreateNewCardViewModel(7), CreateNewCardViewModel(8),
CreateNewCardViewModel(9) ]
struct ReadModelView: View {
@ObservedObject var viewModel: CreateNewCardViewModel
var body: some View {
TextField("placeholder...", text: $viewModel.definition)
.foregroundColor(.black)
}
}
struct MainView: View {
@State private var arrayOfModelState = arrayOfModel
@State private var showModel: Int?
@State private var isPresented: Bool = false
var body: some View {
VStack {
ForEach(Array(arrayOfModelState.enumerated()), id:\.element.id) { (index, item) in
Button(action: { showModel = index; isPresented = true }, label: { Text("Show Model " + item.id.description) }).padding()
}
if let unwrappedValue: Int = showModel {
Color.clear
.sheet(isPresented: $isPresented, content: { ReadModelView(viewModel: arrayOfModelState[unwrappedValue]) })
}
}
.padding()
}
}