0

我正在尝试将 EnvironmentObject 传递给子视图,但对以下代码没有运气。

struct ContentView: View {
  enum MyViews: Int, CaseIterable {

    case introView
    case viewOne
    case viewTwo

    var activeView: AnyView {
      switch self.rawValue {
        case 0: return AnyView(IntroView())
        case 1: return AnyView(ViewOne())
        case 2: return AnyView(ViewTwo())
        default: return AnyView(IntroView())
      }
    }

    @State var pageIndex = 0

    func content() -> MyViews? {
        let newPage = MyViews.init(rawValue: pageIndex)
        return newPage
    }
}

var body: some View {
   Group {
    content()?.activeView // Problem appears to lie here
   }
   .environmentObject(userData)
}

如果我content()?.activeView用一个简单的视图替换,例如TestView()然后我能够成功地打印出TestView() 中的userData 变量。但就目前而言,我在尝试访问 ViewOne() 中的 userData 时遇到了崩溃,即使 ViewOne 与 TestView() 相同。

知道我做错了什么吗?

4

1 回答 1

1

问题是您需要通过 init() 手动将 EnvironmentObject 传递给您的 viewModel。它不会自动注入。这是一种方法

func getActiveView(userData: UserData) -> AnyView {
    switch self.rawValue {
    case 0: return AnyView(IntroView(userData: userData))
      case 1: return AnyView(ViewOne())
    default: return AnyView(IntroView(userData: userData))
    }
}

在您的 ContentView 视图中调用该函数并传递 userData

ZStack {
    content()?
        .getActiveView(userData: userData)
        .environmentObject(userData)
}

IntroView 和 ViewModel 以 userData 作为参数

class AListViewModel: ObservableObject {
    
    var userData: UserData
    init(userData: UserData) {
        self.userData = userData
    }

    func myFunc(){
        print("myVar: \(userData.myVar)")
    }
}

struct IntroView: View {
    @EnvironmentObject var userData: UserData
    
    @ObservedObject var someListVM : AListViewModel
    
    init(userData: UserData) {
        someListVM = AListViewModel(userData: userData)
    }
于 2020-12-12T15:18:21.110 回答