如何在Swiftui View函数中使用EnvironmentObject?

时间:2019-12-03 12:16:11

标签: ios swift xcode swiftui

已解决

  

最后,我找到了问题。我质疑的观点放在一个.sheet中。如果我单独显示此视图,则环境变量将起作用,但是如果将它们放在.sheet中,则必须显式地注入Store。

.sheet(isPresented: $showEditSheet){
        EditFavoriteRootView().environmentObject(Store())
    }
  

现在工作了!

旧问题

因为ForEach无法支持过于复杂的逻辑,所以我在View中定义了一个函数来实现内容。 在大多数情况下,这很好。但是,我不能在函数中使用EnviromentObject。

构建成功,视图主体中的按钮工作正常,但是当我单击函数中的按钮时出现运行时错误:

Fatal error: No ObservableObject of type Store found.
A View.environmentObject(_:) for Store may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-

代码示例:

struct FromCategory: View {
    @EnvironmentObject var store:Store

    var body: some View {
        ForEach(AppState.HealthCategoryList.keys.sorted(by: <),id:\.self){
            self.ShowList(categoryId: $0)
        }
        Button(action:{
           self.store.dispatch(.updateFavorite(idName:"test"))
        }){Text("Test")}

    }

    func ShowList(categoryId:String)->some View{

        let metalist = AppState.HealthCategoryList[categoryId]?.metaData?.sortedArray(using: [NSSortDescriptor(key: "idName", ascending: true)]) as! [HealthMetaData]

        return VStack{
            VStack(spacing:10)  {
                ForEach(0..<metalist.count){i in
                    HStack{
                        Text(metalist[i].title!)
                        Spacer()
                        Button(action:{
                            self.store.dispatch(.updateFavorite(idName: metalist[i].idName!))
                            //self.store.appState.updateFavorite(idName: metalist[i].idName!)
                        }){
                            if AppState.UserFavoriteList[metalist[i].idName!] != nil {
                                Image(systemName: "star.fill")
                            }
                            else {
                                Image(systemName: "star")
                            }
                        }
                    }

                }
            }
        }

    }   

}

致命错误:找不到类型为Store的ObservableObject。在这一行

self.store.dispatch(.updateFavorite(idName: metalist[i].idName!))

store可以在正常的某些View中很好地使用,但不能在功能上使用。 如何解决这个问题。还是还有其他方法? 谢谢

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为您要更新EnvironmentObject,并且不在由 SceneDelegate.swift

加载的视图中

如果您以正确的方式使用EnvObject,则只需将EnvObject传递给下一个视图,如下所示:

DestinationView().environmentObject(self.yourEnvObject)

我的帖子中解释了更多信息: https://stackoverflow.com/a/58997326/12378791