首页 > 解决方案 > Swift + Xcode + macOS:非功能预览。错误与每个 Xcode 的 .environmentObject 相关

问题描述

我正在编写一个 Swift 程序,并试图让其中一个预览工作但没有运气。我收到的错误消息是:由于缺少 NavigationViewModel 类型的环境,程序崩溃。要解决添加 .envionmentObject(NavigationViewModel(...)) 到适当的预览。我已经尝试了几件事,但没有运气。如果有人能指出我的错误,将不胜感激。下面是我的代码。预览部分位于底部。问候克里斯

import SwiftUI
struct ListView: View {
    @EnvironmentObject var navVM: NavigationViewModel
    var body: some View {
        Spacer().frame(height: 30)
        VStack {
            ForEach (navVM.options, id: \.self) { option in
                switch option.id {
                case 0:
                    HomeItem(imageName: option.imageName, title: option.title, id: option.id)
                case 1, 4, 7:
                    MainItem(imageName: option.imageName, title: option.title, id: option.id)
                case 2, 3, 5, 6, 8, 9:
                    SubItem(title: option.title, id: option.id)
                default:
                    Text("Something went wrong")
                } // end switch
            } // end for each
        } // end vstack
        Spacer()
            .frame(width: 180, alignment: .leading)
    } // end var body
} // end list view
struct HomeItem: View {
    let imageName : String
    let title : String
    let id: Int
//    let currentViewId: Int
    @EnvironmentObject var navVM: NavigationViewModel
    var body: some View {
        HStack{
            Image(systemName: imageName)
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 30, height: 30, alignment: .leading)
                .foregroundColor(navVM.highLightedImage == id ? Color.blue : Color.black)
                .padding(.leading, 20 )
                .padding(.top, 10)
            Text(title)
                .font(.system(size: 15))
                .underline()
                .frame(width: 125, alignment: .leading)
                .foregroundColor(Color.blue)
                .padding(.top, 15)
                .onTapGesture {
                    navVM.updateCurrentViewId(value: id)
                    navVM.updateSelectedItem(value: 0)
                    navVM.updateHighLightedImage(value: 0)
                }
        } // end hstack
    }
}
struct MainItem: View {
    let imageName : String
    let title : String
    let id: Int
    @EnvironmentObject var navVM: NavigationViewModel
    var body: some View {
        HStack{
            Image(systemName: imageName)
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 30, height: 30, alignment: .leading)
                .foregroundColor(navVM.highLightedImage == id ? Color.blue : Color.black)
                .padding(.leading, 20 )
                .padding(.top, 10)
            Text(title)
                .font(.system(size: 15))
                .frame(width: 125, alignment: .leading)
                .padding(.top, 10)
        } // end hstack
    }
}
struct SubItem: View {
    let title: String
    //    let currentViewId : Int
    let id: Int
    @EnvironmentObject var navVM: NavigationViewModel
    var body: some View {
        HStack{
            Text(title)
                .font(.system(size: 13))
                .underline()
                .frame(width: 35, alignment: .leading)
                .foregroundColor(Color.blue)
                .padding(.bottom, 2)
                .padding(.leading, 15)
                .onTapGesture {
                    navVM.updateCurrentViewId(value: id)
                    navVM.updateSelectedItem(value: id)
                    switch navVM.selecteditem {
                    case 2, 3:
                        navVM.updateHighLightedImage(value: 1)
                    case 5, 6:
                        navVM.updateHighLightedImage(value: 4)
                    case 8, 9:
                        navVM.updateHighLightedImage(value: 7)
                    default:
                        navVM.updateHighLightedImage(value: 0)
                    }
                }
            switch navVM.currentViewId {
            case id:
                Image(systemName: "checkmark").padding(.bottom, 5).foregroundColor(Color.blue).opacity(100)
            default:
                Image(systemName: "checkmark").padding(.bottom, 5).foregroundColor(Color.blue).opacity(0)
            }
        } // end hstack
    }
}
struct ListView_Previews: PreviewProvider {
    @EnvironmentObject var navVM: NavigationViewModel
    static var previews: some View {
        ListView()
    }
//        .environmentObject(navVM: NavigationViewModel())
}

标签: swiftxcodepreview

解决方案


将其添加到ListView()previews变量中

ListView().environmentObject(navVM: NavigationViewModel())

推荐阅读