Как внедрить.environmentObject() в watchOS6
Я хочу внедрить EnvironmentObject при создании представления SwiftUI в watchOS6.
Но так как WKHostingController ожидает конкретный тип, я не могу сделать следующее ContentView().environmentObject(UserData())
class HostingController: WKHostingController<ContentView> {
override var body: ContentView {
return ContentView().environmentObject(UserData())
}
}
Этот код завершается со следующей ошибкой:
Невозможно преобразовать возвращаемое выражение типа 'some View' в тип возвращаемого значения 'ContentView'
Я видел обходной путь, подобный следующему: использование environmentObject в watchOS это похоже на взлом, а не на правильное решение.
Я спросил инженера watchOS в Twitter о том же, и его ответ должен был быть размещен .environmentObject(UserData())
внутри тела ContentView()
, Я пытался сделать это, но Xcode сообщает об ошибке.
Так кто-нибудь нашел способ сделать то же самое?
1 ответ
Обходной путь по ссылке использует 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")
}
}
}
}