SwiftUI中.onAppear()、NavigationLink等无法更新值问题求助
问题根源
你代码里的ContentView和DetailView各自初始化了独立的ViewModel实例(@StateObject var vm = ViewModel()),导致:
ContentView中调用vm.takeNumber更新的是自己持有的ViewModelDetailView显示的却是另一个初始值为0的ViewModel实例,自然看不到数值变化
解决方案一:共享同一个ViewModel实例
通过把ContentView的ViewModel传递给DetailView,让两个视图共享同一个状态对象。
修改DetailView,改为接收外部传入的ViewModel:
struct DetailView: View { // 用@ObservedObject接收父视图传递的ViewModel实例 @ObservedObject var vm: ViewModel var body: some View { Text("My NUMBER : \(vm.numero)") } }
修改ContentView的NavigationLink,传递ViewModel并在跳转时更新数值:
struct ContentView: View { @StateObject var vm = ViewModel() var body: some View { NavigationView{ List{ ForEach(0..<4){ numero in NavigationLink( destination: DetailView(vm: vm), label: { Text(String(numero)) }) // 在点击跳转时更新ViewModel的数值 .onTapGesture { vm.takeNumber(number: numero) } } } } } }
解决方案二:直接传递数值(轻量场景推荐)
如果只是传递单个数值,不需要共享复杂状态,直接把数值作为参数传给DetailView更简单:
修改DetailView,直接接收数值参数:
struct DetailView: View { let numero: Int var body: some View { Text("My NUMBER : \(numero)") } }
修改ContentView的NavigationLink,直接传递当前数值:
struct ContentView: View { var body: some View { NavigationView{ List{ ForEach(0..<4){ numero in NavigationLink( destination: DetailView(numero: numero), label: { Text(String(numero)) }) } } } } }
这种方式可以完全去掉ViewModel,更适合简单的传值场景。
内容的提问来源于stack exchange,提问作者readytotakeoof
相关产品推荐
相关产品推荐

