【问题标题】:Trouble using @environmentObject and @StateObject使用@environmentObject 和@StateObject 时遇到问题
【发布时间】:2021-12-07 18:34:21
【问题描述】:

我正在创建我的第一个应用程序,但在使用 @EnvironmentObject 和 @StateObject 时遇到了问题。当我运行模拟器时,它会打开我的 ContentView()。我试图让它打开 MainView(),它有一个 tabView。现在 tabView 没有显示我的 ContentView()。我假设我在错误的地方有 @EnvironmentObject 和 @StateObject 。在我的 ContentView 中,它显示了一个列表和 addButton。我基本上是想拥有一个由用户通过填写​​表格来更新的程序。

这里是主要方法

import SwiftUI

@main
struct Location_ScoutApp: App {
    
   @StateObject var listViewModels: ListViewModel = ListViewModel()
    
    var body: some Scene {
        WindowGroup {
          //  MainView(){
               ContentView()
            .environmentObject(listViewModels)
            //}
        }
    }
}

这是我的主视图。

import SwiftUI

struct MainView: View {
    
    var body: some View {
        
        TabView {
            MapView()
                .tabItem {
                    Label("Map", systemImage: "map.circle")
                }
// this is where i am having trouble.
            ContentView()
                .tabItem {
                    Label("Explore", systemImage: "magnifyingglass")
                
            }
            
            ProfileView()
                .tabItem {
                    Label("Profile", systemImage: "person.crop.circle")
                }
        }
    }

}
struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView()

    }
}

这是我的内容视图:

import SwiftUI

struct ContentView: View {
    @EnvironmentObject var listViewModel: ListViewModel
    
    var body: some View {
        List {
            ForEach(listViewModel.items) { item in
// this is where i am getting my new error.
                ListRowView(item: item)
                    .onTapGesture {
                        listViewModel.updateItem(item: item)
                    }
                
            }
        }
        
        .navigationTitle("Explore")
        .navigationBarItems(
            leading: EditButton(),
            trailing:
                NavigationLink("Add", destination: addALandmarkForm()))
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
        ContentView()
    }
        .environmentObject(ListViewModel())
    }
}

【问题讨论】:

  • Location_ScoutApp 中,您已将MainView() 注释掉。你应该使用MainView() 而不是ContentView()
  • 当我编译它时,但当我在模拟器中运行它时,我的 ContentView() 中出现错误。错误:“线程 1:致命错误:未找到 ListViewModel 类型的 ObservableObject。ListViewModel 的 View.environmentObject(_:) 作为此视图的祖先可能会丢失。” @jnpdx
  • 当我尝试你的代码时不会发生这种情况(你遗漏的部分被删除了)。你能加入minimal reproducible example吗?
  • 我添加了更多来自 ListViewModel 的代码,基本上当我运行它时,当我单击它时 ContentView() 选项卡会崩溃。这有帮助吗?
  • 不,它没有,因为您的示例仍然无法编译。请尝试包含一个可以复制并粘贴到 Xcode 中的minimal reproducible example

标签: swiftui swiftui-environment


【解决方案1】:

没有可重现的示例,很难调试。但是,此代码基于您的代码,可以正常工作。或许你能发现你的实现和我的不同:


struct Item : Identifiable {
    var id = UUID()
    var title : String
}

class ListViewModel: ObservableObject {
    @Published var items : [Item] = [.init(title: "Test 1"),.init(title: "Test 2")]
}

@main
struct Location_ScoutApp: App {
    
   @StateObject var listViewModels: ListViewModel = ListViewModel()
    
    var body: some Scene {
        WindowGroup {
          MainView()
            .environmentObject(listViewModels)
        }
    }
}

struct MainView: View {
    
    var body: some View {
        
        TabView {
            Text("Map")
                .tabItem {
                    Label("Map", systemImage: "map.circle")
                }

            ContentView()
                .tabItem {
                    Label("Explore", systemImage: "magnifyingglass")
                
            }
            
            Text("profile")
                .tabItem {
                    Label("Profile", systemImage: "person.crop.circle")
                }
        }
    }

}

struct ContentView: View {
    @EnvironmentObject var listViewModel: ListViewModel
    
    var body: some View {
        NavigationView {
           List {
             ForEach(listViewModel.items) { item in
                 Text(item.title)
             }
           }
           .navigationTitle("Explore")
        }
    }
}

【讨论】:

  • 好的,我让它工作了。我在主要方法下缺少 .environmentObject(listViewModels) 。但是现在我的导航栏没有显示出来。
  • 您拥有NavigationView 的唯一位置是在您的预览中。如果你想在你的 ContentView 中添加它,你应该在那里添加它。我已经更新了我的答案以显示这一点。
  • 非常感谢!!这有很大帮助。我有很多东西要学。对于这些愚蠢的问题,我很抱歉无法给你一个最小的可重复的例子。
  • 没问题。请使用绿色复选标记接受答案。
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多