Nie jestem pewien, czy jest to antypattern w tym odważnym nowym świecie SwiftUI, w którym żyjemy, ale zasadniczo mam @EnvironmentObject z zapisanymi podstawowymi informacjami dla użytkownika, które mogą wywoływać moje poglądy.
Mam również @ObservedObject, który posiada niektóre dane wymagane dla tego widoku.
Kiedy pojawi się widok, chcę użyć tego @EnvironmentObject do zainicjowania @ObservedObject:
struct MyCoolView: View {
@EnvironmentObject userData: UserData
@ObservedObject var viewObject: ViewObject = ViewObject(id: self.userData.UID)
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}
Niestety nie mogę wywołać self w zmiennej środowiskowej, dopóki nie zostanie zainicjowana:
„Nie można użyć elementu członkowskiego„ userData ”instancji w inicjalizatorze właściwości; inicjatory właściwości są uruchamiane, zanim będzie dostępne„ self ”.”
Widzę kilka możliwych dróg naprzód, ale wszystkie wydają się hackami. Jak mam do tego podejść?
init
strukturę.Property wrappers are not yet supported on local properties
Zasadniczo to powiedzenie, że nie mogę utworzyć @ObservedObject w metodzie init.Odpowiedzi:
Oto podejście (najprostsze IMO):
źródło
zamiast tworzyć widok podrzędny, możesz dodać do niego atrapę inicjatora, aby
"ViewObject"
móc go wywołać przed wywołaniem prawdziwego inicjalizatoradla przypomnienia, nie testowałem tego
źródło
Oto prosty sposób:
Dzięki temu pomocnikowi, który sprawia, że działa:
źródło