【问题标题】:How to pass data from one model to another model?如何将数据从一个模型传递到另一个模型?
【发布时间】:2021-12-13 08:22:12
【问题描述】:

我有两个不同的视图,每个视图都有一个模型来保存它们的数据。我正在尝试传递模型中一个变量的值以在另一个模型中使用,但第一个模型的值没有被传递。

第一个文件

struct Number: View {

@StateObject var model = NumberModel()

var body: some View {
    NavigationView {
        Form {
            Section {
                TextField("Enter your first number", text: $model.firstNum)
                    .keyboardType(.decimalPad)
            }
            Section {
                Text("\(model.firstNum)")
            }
        }
    }
}
}

第一个文件的模型

class NumberModel: ObservableObject {
@Published var firstNum: String

init() {
    self.firstNum = ""
}
}

第二个文件

struct SecondNumber: View {

@StateObject var model = SecondNumberModel()

var body: some View {
    NavigationView {
        Form {
            Section {
                TextField("Enter your second number", text: $model.secondNum)
                    .keyboardType(.decimalPad)
            }
            Section {
                Button {
                    model.add()
                } label: {
                    Text("Press Me!!!")
                }

            }
            Section {
                Text("\(model.total)")
            }
        }
    }
}
}

第二个文件的模型

class SecondNumberModel: ObservableObject {
@ObservedObject var model = NumberModel()

@Published var secondNum: String

@Published var total: Int

init() {
    self.secondNum = ""
    self.total = 0
}

func add() {
    self.total = Int(self.secondNum + self.model.firstNum) ?? 0
}
}

这是内容视图

struct ContentView: View {
var body: some View {
    TabView {
        Number()
            .tabItem {
                Image(systemName: "circle.fill")
                Text("First")
            }
        SecondNumber()
            .tabItem {
                Image(systemName: "circle.fill")
                Text("Second")
            }
    }
}
}

我正在尝试从第一个文件中获取用户输入,然后将该号码发送到第二个文件,以便与收集的第二个号码一起添加。但是第一个数字的值不会传递到第二个文件的模型中。感谢任何帮助。谢谢。

【问题讨论】:

  • 每次编写NumberModel() 时,您都会创建NumberModel新实例。如果你想共享同一个模型,你必须在你的视图之间传递一个对同一个实例的引用。因为您的代码没有清楚地表明 NumberSecondNumber 在视图层次结构中是如何连接的,所以很难就如何做到这一点提出建议。您能否更新您的问题以显示两者在您的代码中的关系?
  • 所以目前视图没有任何相关性。我认为我需要做的就是将 numberModel 传递给 secondnumbermodel,然后在 secondnumbermodel 中使用 numberModel 中的值。我将如何传递视图的相同实例?我还要在模型中进行计算吗?
  • "我将如何传递同一个视图实例?"不是景色。您需要引用 View Model 的同一实例。为此,我们需要了解这两个视图之间的关系。
  • 抱歉,我有点困惑如何显示这种关系。如果我从 Xcode 添加项目的屏幕截图会起作用吗?
  • 我刚刚用视图层次结构更新了问题,显示了它们都被调用的时间。感谢您帮助我了解有关如何显示关系的更多信息。

标签: ios iphone swiftui model


【解决方案1】:

如果您有需要共享状态的同级视图,则该状态应由父视图控制。例如,这适用于您的情况:

class NumberModel: ObservableObject {
    @Published var firstNum: String = ""
    @Published var secondNum: String = ""
    @Published var total: Int = 0
    
    func add() {
        self.total = Int(self.secondNum + self.firstNum) ?? 0
    }
}

struct Number: View {
    @ObservedObject var model : NumberModel
    
    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Enter your first number", text: $model.firstNum)
                        .keyboardType(.decimalPad)
                }
                Section {
                    Text("\(model.firstNum)")
                }
            }
        }
    }
}

struct SecondNumber: View {
    
    @ObservedObject var model : NumberModel
    
    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Enter your second number", text: $model.secondNum)
                        .keyboardType(.decimalPad)
                }
                Section {
                    Button {
                        model.add()
                    } label: {
                        Text("Press Me!!!")
                    }
                    
                }
                Section {
                    Text("\(model.total)")
                }
            }
        }
    }
}

struct ContentView: View {
    @StateObject private var appState = NumberModel()
    
    var body: some View {
        TabView {
            Number(model: appState)
                .tabItem {
                    Image(systemName: "circle.fill")
                    Text("First")
                }
            SecondNumber(model: appState)
                .tabItem {
                    Image(systemName: "circle.fill")
                    Text("Second")
                }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多