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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:40:41