J'essaie d'utiliser environmentObjectdans une application watchOS6 pour lier mon modèle de données à ma vue.
J'ai créé une application Watch simple et autonome dans Xcode 11.
J'ai créé une nouvelle DataModelclasse
import Combine
import Foundation
import SwiftUI
final class DataModel: BindableObject {
let didChange = PassthroughSubject<DataModel,Never>()
var aString: String = "" {
didSet {
didChange.send(self)
}
}
}
Dans ma ContentViewstructure, je lie cette classe en utilisant @EnvironmentObject-
struct ContentView : View {
@EnvironmentObject private var dataModel: DataModel
var body: some View {
Text($dataModel.aString.value)
}
}
Enfin, j'essaye d'injecter une instance du DataModeldans l'environnement de la HostingControllerclasse -
class HostingController : WKHostingController<ContentView> {
override var body: ContentView {
return ContentView().environmentObject(DataModel())
}
}
Mais, j'obtiens une erreur:
Cannot convert return expression of type '_ModifiedContent<ContentView, _EnvironmentKeyWritingModifier<DataModel?>>' to return type 'ContentView'
L'erreur est que le WKHostingControllerest un générique qui a besoin d'un type concret - WKHostingController<ContentView>dans ce cas.
Une approche similaire fonctionne parfaitement UIHostingControllerdans une application iOS car il UIHostingControllerne s'agit pas d'une classe générique.
Existe-t-il un autre moyen d'injecter l'environnement dans une vue watchOS?