You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:54:02