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
相关产品推荐
相关产品推荐

