如何在SwiftUI中实现不同ObservableObject模型间的数据传递?
问题根源
- 你当前代码里创建了两个完全独立的
NumberModel实例:第一个是Number视图里的@StateObject实例,第二个是SecondNumberModel内部初始化的NumberModel(),二者没有任何关联,自然拿不到第一个视图输入的值 @ObservedObject只能用在SwiftUI的View结构体内,不能放在ObservableObject类的属性声明里,这个用法本身是错误的- 你原有求和逻辑写的是字符串拼接,输入1和2会得到12而非求和结果3,需要额外修正
可行修改方案
1. 调整ContentView,创建共享的NumberModel实例
struct ContentView: View { // 父视图持有全局共享的NumberModel @StateObject private var shareNumberModel = NumberModel() var body: some View { TabView { Number(model: shareNumberModel) .tabItem { Image(systemName: "circle.fill") Text("First") } SecondNumber(shareNumberModel: shareNumberModel) .tabItem { Image(systemName: "circle.fill") Text("Second") } } } }
2. 修改Number视图,改为接收外部传入的模型
struct Number: View { // 外部传入的共享模型用@ObservedObject接收 @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)") } } } } }
3. 修改SecondNumberModel,初始化时接收共享模型
class SecondNumberModel: ObservableObject { // 直接持有共享的NumberModel,不需要属性包装器 var shareModel: NumberModel @Published var secondNum: String @Published var total: Int // 初始化时传入共享实例 init(shareModel: NumberModel) { self.shareModel = shareModel self.secondNum = "" self.total = 0 } // 修正求和逻辑 func add() { guard let first = Int(shareModel.firstNum), let second = Int(secondNum) else { total = 0 return } total = first + second } }
4. 修改SecondNumber视图,接收共享模型完成初始化
struct SecondNumber: View { @StateObject var model: SecondNumberModel // 初始化时接收传入的共享NumberModel init(shareNumberModel: NumberModel) { _model = StateObject(wrappedValue: SecondNumberModel(shareModel: shareNumberModel)) } 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)") } } } } }
内容的提问来源于stack exchange,提问作者Calvin Wood
相关产品推荐
相关产品推荐

