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

SwiftUI预览崩溃:使用@ObservedObject与可选@Published变量异常

SwiftUI预览崩溃问题:含特定ObservableObject的视图预览失败,模拟器运行正常

无编译错误,应用在模拟器中运行完全正常,但所有包含AzureAccount这个ObservableObject的视图预览均崩溃。无论是初始用@ObservedObject传参的方式,还是后续改用@EnvironmentObject的方案,预览都显示红色X并提示"Preview Crashed",但模拟器内功能不受影响。


相关代码

AzureAccount.swift(ObservableObject定义)

import Foundation
import MSAL

class AzureAccount: ObservableObject {
    @Published var account: MSALAccount? = nil
}

预览正常的视图:AccountTypeSelectionView

该视图中直接实例化AzureAccount,预览可以正常工作:

import SwiftUI
import MSAL

struct AccountTypeSelectionView: View {
    @StateObject var azureAccount = AzureAccount()
    @State private var showTeacherHome = false

// 部分登录流程

    .navigationDestination(isPresented: $showTeacherHome, destination: {
        TeacherHomeView(azureAccount: azureAccount)
    })
}

struct AccountTypeSelectionView_Previews: PreviewProvider {
    static var previews: some View {
        AccountTypeSelectionView()
    }
}

预览崩溃的初始版视图:TeacherHomeView

通过@ObservedObject接收AzureAccount实例,预览直接崩溃:

import SwiftUI
import MSAL

struct TeacherHomeView: View {
    
    @State var selection = "roster"

    @ObservedObject var azureAccount: AzureAccount
    
    var body: some View {
        TabView(selection: $selection) {
            TeacherClassView(azureAccount: azureAccount)
                .tabItem {
                    Label("Students", systemImage: "person.3.fill")
                }
                .tag("roster")
            TeacherToolkitView()
                .tabItem {
                    Label("Toolkit", systemImage: "briefcase.fill")
                }
                .tag("toolkit")
        }
        .navigationTitle(selection == "roster" ? "Roster" : "Toolkit")
        .toolbar(.hidden)
    }
}

struct TeacherHomeView_Previews: PreviewProvider {
    static var previews: some View {
        TeacherHomeView(azureAccount: AzureAccount())
    }
}

尝试改用EnvironmentObject后的情况

修改为通过环境对象传递AzureAccount后,模拟器运行依然正常,但预览仍然崩溃。

ClassMateApp.swift(全局注入环境对象)

@main
struct ClassMateApp: App {
    @StateObject var azureAccount = AzureAccount()
    var body: some Scene {
        WindowGroup {
            AccountTypeSelectionView()
                .environmentObject(azureAccount)
        }
    }
}

修改后的TeacherHomeView及预览

struct TeacherHomeView: View {
    @EnvironmentObject var azureAccount: AzureAccount
    var body: some View {
        // 内容未修改
    }
}
struct TeacherHomeView_Previews: PreviewProvider {
    static var previews: some View {
        TeacherHomeView()
            .environmentObject(AzureAccount())
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:09:54