SwiftUI:从StarterView返回OrderView后total变量未更新求助
问题原因及解决方法
核心原因:ViewModel实例不共享
你在StarterView中更新的total属于另一个独立的TotalViewModel实例,和OrderView绑定的并非同一个对象。如果跳转StarterView时,没有传递OrderView当前使用的totalViewModel实例,而是在StarterView中新建了一个实例,那么两边的total数据自然不会同步。
验证方式
在TotalViewModel的初始化方法中添加打印语句,查看OrderView和StarterView的ViewModel是否为同一实例:
class TotalViewModel: ObservableObject { @Published var total: Float = 0 init() { print("ViewModel实例地址: \(self)") } }
如果两次打印的内存地址不同,即可确认是实例不共享导致的问题。
解决方法
确保两个视图使用同一个TotalViewModel实例,有两种常用实现方式:
1. 通过NavigationLink直接传递实例
在OrderView的NavigationLink中,将当前的totalViewModel传递给StarterView:
struct OrderView: View { @ObservedObject var totalViewModel: TotalViewModel var body: some View { NavigationStack { Text("£\(totalViewModel.total)") NavigationLink("进入StarterView") { StarterView(totalViewModel: totalViewModel) // 传递同一实例 } } } }
StarterView接收该实例并直接操作:
struct StarterView: View { @ObservedObject var totalViewModel: TotalViewModel var body: some View { Button("增加10") { totalViewModel.total += 10 } } }
2. 使用@EnvironmentObject全局共享实例
在父视图中初始化ViewModel,通过环境注入让所有子视图共享:
// 父视图(如App入口或主视图) struct ContentView: View { @StateObject var totalViewModel = TotalViewModel() var body: some View { NavigationStack { OrderView() } .environmentObject(totalViewModel) } }
OrderView和StarterView通过@EnvironmentObject接收共享实例:
struct OrderView: View { @EnvironmentObject var totalViewModel: TotalViewModel var body: some View { Text("£\(totalViewModel.total)") NavigationLink("进入StarterView") { StarterView() } } } struct StarterView: View { @EnvironmentObject var totalViewModel: TotalViewModel var body: some View { Button("增加10") { totalViewModel.total += 10 } } }
内容的提问来源于stack exchange,提问作者Benjamin Young
相关产品推荐
相关产品推荐

