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

尝试从Model更新ProgressView时SwiftUI视图意外关闭

问题排查与解决

可能原因1:ViewModel生命周期异常

你当前使用@ObservedObject持有OTAViewModel,如果这个ViewModel实例是从父视图传递而来,且父视图未正确持有它(比如父视图用@State而非@StateObject),当ViewModel被释放时,SwiftUI会自动销毁关联的视图。

解决方法:

  • 若InstallFirmwareView是ViewModel的创建者,将@ObservedObject替换为@StateObject(iOS14+/macOS11+支持),它会自动管理ViewModel的生命周期:
struct InstallFirmwareView: View {
    @StateObject private var model = OTAViewModel()
    // 其余代码不变
}
  • 若ViewModel从父视图传入,确保父视图用@StateObject持有实例,子视图用@ObservedObject接收:
// 父视图
struct ParentView: View {
    @StateObject private var otaModel = OTAViewModel()
    
    var body: some View {
        NavigationStack {
            NavigationLink("进入固件安装") {
                InstallFirmwareView(model: otaModel)
            }
        }
    }
}

// 子视图
struct InstallFirmwareView: View {
    @ObservedObject var model: OTAViewModel
    // 其余代码不变
}

可能原因2:隐藏的导航自动关闭逻辑

检查父视图或ViewModel中是否存在基于progress值的导航自动关闭逻辑,比如当progress达到0.9时,通过绑定的isPresented或navigationDestination条件触发视图弹出。如果有这类逻辑,需调整触发时机或移除不必要的自动关闭代码。

可能原因3:线程安全隐患

虽然OTAViewModel标记了@MainActor,要确保所有对progress的修改都在主线程执行。你当前的DispatchQueue.main.asyncAfter已在主线程,但如果后续有其他异步操作更新进度,必须保证在@MainActor上下文执行:

@MainActor class OTAViewModel: ObservableObject {
    @Published var progress: Float = 0.5
    
    func installFirmware() {
        self.progress = 0.9
    }
    
    // 示例:异步操作更新进度
    func simulateLongTask() async {
        try? await Task.sleep(nanoseconds: 2_000_000_000)
        self.progress = 0.9
    }
}

调试辅助建议

  • 在InstallFirmwareView的onDisappear中添加打印,确认视图销毁时机:
.onDisappear {
    print("InstallFirmwareView 已销毁")
}
  • 在OTAViewModel的deinit方法中添加打印,确认ViewModel是否被提前释放:
@MainActor class OTAViewModel: ObservableObject {
    @Published var progress: Float = 0.5
    
    deinit {
        print("OTAViewModel 已释放")
    }
    
    func installFirmware() {
        self.progress = 0.9
    }
}

通过这些打印可以快速定位是ViewModel被释放导致视图销毁,还是其他导航逻辑触发了视图关闭。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:05:30