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

SwiftUI问题:@State属性未随School静态变量变更更新

解决SwiftUI中按钮点击后学生计数不更新的问题

问题核心原因:你定义的@State变量test仅在视图初始化时获取了School.studentCount的初始值,后续School.studentCount变化时,test不会自动同步,SwiftUI也没有收到视图重绘的触发信号,导致按钮文本始终显示初始值。

下面提供两种可行的修复方案:

方案一:手动同步计数(简单直接)

在按钮的点击动作里,调用add方法后手动更新test变量,利用@State的特性触发视图重绘:

import SwiftUI

struct School {
    static var studentCount = 0

    static func add(student: String) {
        print("\(student) joined the school.")
        studentCount += 1
    }
}

struct ReviewClosuresAndStructs: View {
    @State private var test = School.studentCount
    
    var body: some View {
        VStack {
            Button(action: {
                School.add(student: "Tyler")
                // 手动同步最新的学生计数
                test = School.studentCount
            }, label: {
                Text("Press me. \n Students: \(test)")
            })
        }
    }
}

方案二:使用可观察对象(适合多场景修改)

如果后续School的计数可能在多个地方被修改,手动同步会增加维护成本。这时可以将School改为遵循ObservableObject的类,通过@Published属性自动通知视图更新:

import SwiftUI

class School: ObservableObject {
    // 全局单例,确保计数状态唯一
    static let shared = School()
    private init() {}
    
    // @Published会在属性变化时自动发送更新通知
    @Published var studentCount = 0

    func add(student: String) {
        print("\(student) joined the school.")
        studentCount += 1
    }
}

struct ReviewClosuresAndStructs: View {
    // 监听School实例的变化
    @ObservedObject private var school = School.shared
    
    var body: some View {
        VStack {
            Button(action: {
                school.add(student: "Tyler")
            }, label: {
                Text("Press me. \n Students: \(school.studentCount)")
            })
        }
    }
}

这种方式下,无论在哪个地方调用School.shared.add(student:),视图都会自动感知到studentCount的变化并刷新显示。

内容的提问来源于stack exchange,提问作者b.joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:50:28