我想在watchOS6中创建SwiftUI视图时注入一个EnvironmentObject。
但是由于WKHostingController期望使用具体类型,所以我无法执行以下ContentView().environmentObject(UserData())
class HostingController: WKHostingController<ContentView> {
override var body: ContentView {
return ContentView().environmentObject(UserData())
}
}
此代码失败,并出现以下错误:
无法将“某些视图”类型的返回表达式转换为“ ContentView”类型
我看到了这样的解决方法: Using environmentObject in watchOS似乎是hack,而不是适当的解决方案。
我在Twitter上问了一个watchOS工程师,他的回答是将.environmentObject(UserData())
放在ContentView()
的正文中。我尝试这样做,但是Xcode报告错误。
那么有没有人找到一种方法来做同样的事情?
答案 0 :(得分:5)
链接中的解决方法使用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")
}
}
}
}