Nik*_*kur 2 swift swiftui watchos-6
我想在 watchOS6 中创建 SwiftUI 视图时注入 EnvironmentObject。
但是由于 WKHostingController 需要一个具体类型,我无法执行以下操作 ContentView().environmentObject(UserData())
class HostingController: WKHostingController<ContentView> {
override var body: ContentView {
return ContentView().environmentObject(UserData())
}
}
Run Code Online (Sandbox Code Playgroud)
此代码失败并出现以下错误:
无法将“some View”类型的返回表达式转换为“ContentView”类型
我见过这样的解决方法: 在 watchOS 中使用 environmentObject这似乎是一个黑客而不是一个正确的解决方案。
我问关于同在Twitter上watchOS工程师,他的回答是地方.environmentObject(UserData())的主体内ContentView()。我尝试这样做,但 Xcode 报告错误。
那么有没有人找到一种方法来做同样的事情?
kon*_*iki 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")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |