我想在 watchOS 6 中创建 SwiftUI 视图时注入环境对象。
但由于 WKHostingController 需要具体类型,我无法执行以下操作ContentView().environmentObject(UserData())
class HostingController: WKHostingController<ContentView> {
override var body: ContentView {
return ContentView().environmentObject(UserData())
}
}
此代码失败并出现以下错误:
无法将“some View”类型的返回表达式转换为“ContentView”返回类型
我见过这样的解决方法:在 watchOS 中使用environmentObject这看起来像是一个黑客而不是一个正确的解决方案。
我在 Twitter 上向 watchOS 工程师询问了同样的问题,他的答复是.environmentObject(UserData())
体内ContentView()
。我尝试这样做,但 Xcode 报告错误。
那么有人找到了同样的方法吗?
链接中的解决方法使用AnyView
,这是一个非常糟糕的主意。 Apple 工程师在其他几个问题和推文中已经解释过,AnyView 只能在叶视图上使用,否则会对性能造成严重影响。
至于第二个选项(将environmentObject
inside 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")
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)