SwiftUI中如何让更新后的Int值在新视图结构体中保持一致
解决SwiftUI中跨View共享ObservableObject状态的问题
你的问题核心是两个View各自创建了独立的NumberOrder实例——Choose和Feeling1都用@StateObject初始化了全新的NumberOrder,导致两者的数值状态完全隔离,Feeling1自然看不到Choose里累加后的结果。
要实现状态共享,只需要让两个View复用同一个NumberOrder实例,具体修改如下:
步骤1:调整Feeling1的状态接收方式
把Feeling1里的@StateObject var numbeorder = NumberOrder()改成@ObservedObject var numbeorder: NumberOrder,用来接收从父View传递过来的共享实例。
步骤2:传递共享实例到Feeling1
在Choose中显示Feeling1时,把自身的numbeorder实例传进去:Feeling1(numbeorder: numbeorder)
步骤3:修复返回逻辑(避免状态重置)
原来从Feeling1返回时重新创建了Choose(),这会导致之前累加的状态全部丢失。改成用布尔值绑定控制显示,保持原Choose实例的状态。
修正后的完整代码
import SwiftUI class NumberOrder: ObservableObject { @Published var number: Int = 0 // 统一用小驼峰命名,符合Swift编码规范 } struct Choose: View { @State var showFeeling1: Bool = false // 变量名更语义化 @StateObject private var numberOrder = NumberOrder() // 统一命名并限制访问 var body: some View { ZStack { Color.black.ignoresSafeArea() // 让背景铺满整个屏幕 VStack(spacing: 40) { // 用spacing简化布局 Text("\(numberOrder.number)") .font(.system(size: 50)) .foregroundColor(.white) // 避免黑色背景下文字不可见 Button { showFeeling1.toggle() } label: { Image(systemName: "arrow.left.circle") .foregroundColor(.white) .font(.system(size: 50)) } Button { numberOrder.number += 1 } label: { Text("ADD ONE") .font(.system(size: 40, weight: .medium)) .foregroundColor(.black) .padding() .background(Color.white) .cornerRadius(10) } } if showFeeling1 { // 传递共享的NumberOrder实例,用Binding控制显示状态 Feeling1(numberOrder: numberOrder, isPresented: $showFeeling1) } } } } struct Feeling1: View { @ObservedObject var numberOrder: NumberOrder // 接收父View的共享实例 @Binding var isPresented: Bool // 通过Binding控制自身显示/隐藏 var body: some View { ZStack { Color.purple.ignoresSafeArea() VStack(spacing: 40) { Text("\(numberOrder.number)") .font(.system(size: 50)) .foregroundColor(.white) Button { isPresented.toggle() // 直接关闭当前View,回到原Choose实例 } label: { Image(systemName: "arrow.left.circle") .foregroundColor(.white) .font(.system(size: 50)) } } } } } struct Choose_Previews: PreviewProvider { static var previews: some View { Choose() } }
额外优化说明
- 统一变量命名风格为Swift规范的小驼峰
- 用
@Binding替代重新创建View的逻辑,彻底避免状态丢失 - 添加了前景色和背景处理,优化视觉体验
- 用
spacing简化布局代码,提升可读性
内容的提问来源于stack exchange,提问作者QuirckyOrk
相关产品推荐
相关产品推荐

