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

SwiftUI中.onAppear()、NavigationLink等无法更新值问题求助

SwiftUI中NavigationLink跳转后数值不更新的解决方案

问题根源

你代码里的ContentView和DetailView各自初始化了独立的ViewModel实例(@StateObject var vm = ViewModel()),导致:

  • ContentView中调用vm.takeNumber更新的是自己持有的ViewModel
  • DetailView显示的却是另一个初始值为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:20:20