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
相关产品推荐
相关产品推荐

