2

我想在 watchOS6 中创建 SwiftUI 视图时注入一个 EnvironmentObject。

但是由于 WKHostingController 需要具体类型,因此我无法执行以下操作ContentView().environmentObject(UserData())

class HostingController: WKHostingController<ContentView> {
    override var body: ContentView {
        return ContentView().environmentObject(UserData())
    }
}

此代码失败并出现以下错误:

无法将“某些视图”类型的返回表达式转换为“内容视图”类型

我见过这样的解决方法: 在 watchOS 中使用 environmentObject这似乎是一种 hack 而不是正确的解决方案。

我在 Twitter 上询问了一位 watchOS 工程师,他的回答是.environmentObject(UserData())放在ContentView(). 我尝试这样做,但 Xcode 报告错误。

那么有没有人找到一种方法来做同样的事情?

4

1 回答 1

10

链接中的解决方法使用AnyView,这是一个非常糟糕的主意。Apple 工程师在其他几个问题和推文中已经解释过,AnyView 应该只用于叶子视图,否则会严重影响性能。

至于第二个选项(放在environmentObject里面ContentView),它工作正常。这里有一个例子:

class UserData: ObservableObject {
    @Published var show: Bool = true
}

struct ContentView: View {
    @State var model = UserData()

    var body: some View {
        SubView().environmentObject(model)
    }
}

struct SubView: View {
    @EnvironmentObject var model: UserData

    var body: some View {
        VStack {
            Text("Tap Me!").onTapGesture {
                self.model.show.toggle()
            }

            if self.model.show {
                Text("Hello World")
            }
        }
    }
}
于 2019-08-19T16:42:03.247 回答