Swiftui 线程1:致命错误:没有类型为的ObservieObject

Swiftui 线程1:致命错误:没有类型为的ObservieObject,swiftui,environment,observedobject,Swiftui,Environment,Observedobject,视频链接 控制台错误 Fatal error: No ObservableObject of type UserDefaultsConfig found. A View.environmentObject(_:) for UserDefaultsConfig may be missing as an ancestor of this view.: file SwiftUI, line 0 用户默认配置 class UserDefaultsConfig: ObservableObject {

视频链接

控制台错误

Fatal error: No ObservableObject of type UserDefaultsConfig found. A View.environmentObject(_:) for UserDefaultsConfig may be missing as an ancestor of this view.: file SwiftUI, line 0
用户默认配置

class UserDefaultsConfig: ObservableObject {
    
    @Published var allFavoriteMovie: [PopularMovie] = []
    let defaults = UserDefaults.standard
    
    func setUserDefaults(value: PopularMovie) {
        let encoder = JSONEncoder()
        if let encoded = try? encoder.encode(value) {
            
            defaults.set(encoded, forKey: "favoriteMovie")
        }
        
        if let savedFavoriteMovie = defaults.object(forKey: "favoriteMovie") as? Data {
            let decoder = JSONDecoder()
            if let loadedFavMovie = try? decoder.decode(PopularMovie.self, from: savedFavoriteMovie) {
                allFavoriteMovie.append(loadedFavMovie)
                print("favMovie: \(allFavoriteMovie)")
            }
        }
    }
}
CustomTabView首先打开

自定义选项卡视图

TabView(selection: $selectedTab) {
                
       MainView(searchMovie: SearchMovieVM(), mainVM: MainVM())
                .ignoresSafeArea()
                .tag(TabCategory.movieList)
                
       FavoriteView()
                .ignoresSafeArea()
                .tag(TabCategory.favorite)
            }
        NavigationLink(
            destination: DetailView(movie: .constant(mainVM.popularMovie[movie])),
            label: {
                MovieCell(popularMovie: .constant(mainVM.popularMovie[movie]))
                   .foregroundColor(Color(UIColor.label))
            })
struct FavoriteView: View {
    @EnvironmentObject var userDefaultsConfig: UserDefaultsConfig
    var body: some View {
        VStack {
//            ForEach(userDefaultsConfig.allFavoriteMovie, id: \.id) { item in
//                Text(item.title ?? "")
//            }
            Text("")
                .onAppear {
                    print(self.userDefaultsConfig.allFavoriteMovie)
                }
        }
    }
}
我在MainView中单击MovieCell并将其指向DetailView

MainView

TabView(selection: $selectedTab) {
                
       MainView(searchMovie: SearchMovieVM(), mainVM: MainVM())
                .ignoresSafeArea()
                .tag(TabCategory.movieList)
                
       FavoriteView()
                .ignoresSafeArea()
                .tag(TabCategory.favorite)
            }
        NavigationLink(
            destination: DetailView(movie: .constant(mainVM.popularMovie[movie])),
            label: {
                MovieCell(popularMovie: .constant(mainVM.popularMovie[movie]))
                   .foregroundColor(Color(UIColor.label))
            })
struct FavoriteView: View {
    @EnvironmentObject var userDefaultsConfig: UserDefaultsConfig
    var body: some View {
        VStack {
//            ForEach(userDefaultsConfig.allFavoriteMovie, id: \.id) { item in
//                Text(item.title ?? "")
//            }
            Text("")
                .onAppear {
                    print(self.userDefaultsConfig.allFavoriteMovie)
                }
        }
    }
}
详细视图

TabView(selection: $selectedTab) {
                
       MainView(searchMovie: SearchMovieVM(), mainVM: MainVM())
                .ignoresSafeArea()
                .tag(TabCategory.movieList)
                
       FavoriteView()
                .ignoresSafeArea()
                .tag(TabCategory.favorite)
            }
        NavigationLink(
            destination: DetailView(movie: .constant(mainVM.popularMovie[movie])),
            label: {
                MovieCell(popularMovie: .constant(mainVM.popularMovie[movie]))
                   .foregroundColor(Color(UIColor.label))
            })
struct FavoriteView: View {
    @EnvironmentObject var userDefaultsConfig: UserDefaultsConfig
    var body: some View {
        VStack {
//            ForEach(userDefaultsConfig.allFavoriteMovie, id: \.id) { item in
//                Text(item.title ?? "")
//            }
            Text("")
                .onAppear {
                    print(self.userDefaultsConfig.allFavoriteMovie)
                }
        }
    }
}
当我点击这里的按钮时,userDefaultsConfig中的setUserDefaults函数正在运行

struct DetailView: View {
    ....
    @StateObject var userDefaultsConfig = UserDefaultsConfig()
    var body: some View {
        ZStack {
            .....
            ScrollView(.vertical, showsIndicators: false) {
                .....
                    
                    HStack {
                        Spacer()
                        Button(action: { self.userDefaultsConfig.setUserDefaults(value: movie) }) {
                            Image(systemName: "suit.heart")
                                .imageScale(.large)
                                .foregroundColor(.red)
                        }
                    }
                    
                   ....
                    
                }
                .padding(.horizontal)
                
            }
        }
        .environmentObject(userDefaultsConfig)
    }
}
在DetailView页面上以UserDefaults保存的电影将显示在收藏夹页面上,但是当我打开收藏夹页面时,我得到一个错误

偏好视图

TabView(selection: $selectedTab) {
                
       MainView(searchMovie: SearchMovieVM(), mainVM: MainVM())
                .ignoresSafeArea()
                .tag(TabCategory.movieList)
                
       FavoriteView()
                .ignoresSafeArea()
                .tag(TabCategory.favorite)
            }
        NavigationLink(
            destination: DetailView(movie: .constant(mainVM.popularMovie[movie])),
            label: {
                MovieCell(popularMovie: .constant(mainVM.popularMovie[movie]))
                   .foregroundColor(Color(UIColor.label))
            })
struct FavoriteView: View {
    @EnvironmentObject var userDefaultsConfig: UserDefaultsConfig
    var body: some View {
        VStack {
//            ForEach(userDefaultsConfig.allFavoriteMovie, id: \.id) { item in
//                Text(item.title ?? "")
//            }
            Text("")
                .onAppear {
                    print(self.userDefaultsConfig.allFavoriteMovie)
                }
        }
    }
}

您需要将state对象放置在
CustomTabView
中,如

struct CustomTabView: View {
    ....
    @StateObject var userDefaultsConfig = UserDefaultsConfig()

    ...

      TabView(selection: $selectedTab) {
                
          MainView(searchMovie: SearchMovieVM(), mainVM: MainVM())
                .ignoresSafeArea()
                .tag(TabCategory.movieList)
                
          FavoriteView()
                .ignoresSafeArea()
                .tag(TabCategory.favorite)
       }
       .environmentObject(userDefaultsConfig)    // << here !!
    ...

谢谢你,先生。这是成功的。