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

SwiftUI中ViewModel无限重复初始化问题求助

问题原因分析
  • @StateObject的生命周期机制:@StateObject的作用是在视图的整个生命周期内管理ObservableObject实例,当该实例的@Published属性发生变化时,会触发持有它的视图(此处为FatherView)重新渲染。
  • 无限循环触发链:
    1. FatherView通过@StateObject持有Settings.shared,当Settings的@Published属性(如test)被修改时,FatherView会刷新,进而重新创建ContentView实例。
    2. ContentView的初始化方法中每次都会新建ViewModel,而ViewModel的初始化逻辑又会修改Settings.shared.test,再次触发Settings的属性变更,导致FatherView再次刷新,形成无限循环。
解决方案

方案1:不要用@StateObject托管单例

单例本身是全局唯一且自行管理生命周期的,不需要@StateObject来托管。将FatherView中的@StateObject替换为@ObservedObject,或者直接删除该属性,在需要访问设置时直接调用Settings.shared:

struct FatherView: View {
    // 改用@ObservedObject,或直接删除此属性
    @ObservedObject var settings = Settings.shared
    var body: some View {
        ContentView()
    }
}

方案2:优化ContentView的ViewModel初始化逻辑

避免在ContentView的初始化方法中重复创建ViewModel,让ViewModel的生命周期由@StateObject托管,确保仅在视图首次加载时初始化一次:

struct ContentView: View {
    @StateObject private var model = ViewModel()
    
    var body: some View {
        VStack {
            Text("Hi")
            // 若需访问AnotherViewModel的属性,直接使用model.anotherViewModel.name即可
        }
    }
}

这样ViewModel只会被创建一次,不会因FatherView的刷新而重复初始化,彻底打断循环触发链。

内容的提问来源于stack exchange,提问作者Perry Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:15:31