如何在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()
  
    }
}