Próbuję utworzyć niestandardowe opakowanie właściwości obsługiwane przez SwiftUI, co oznacza, że zmiany w odpowiednich wartościach właściwości spowodowałyby aktualizację widoku SwiftUI. Oto uproszczona wersja tego, co mam:
@propertyWrapper
public struct Foo: DynamicProperty {
@ObservedObject var observed: SomeObservedObject
public var wrappedValue: [SomeValue] {
return observed.value
}
}
Widzę, że nawet jeśli moja ObservedObject
zawartość jest zawarta w opakowaniu właściwości niestandardowej, SwiftUI nadal przechwytuje zmiany SomeObservedObject
tak długo, jak:
- Moje opakowanie właściwości jest strukturą
- Moje opakowanie właściwości jest zgodne z
DynamicProperty
Niestety dokumenty są rzadkie i trudno mi powiedzieć, czy przy obecnej implementacji SwiftUI działa to tylko pechowo.
Dokumenty z DynamicProperty
(w Xcode, nie online) wydają się wskazywać, że taka właściwość jest zmieniona z zewnątrz, powodując przerysowanie widoku, ale nie ma gwarancji, co się stanie, gdy dostosujesz własne typy do tego protokołu.
Czy mogę oczekiwać, że nadal będzie działać w przyszłych wersjach SwiftUI?
źródło
Odpowiedzi:
Ok ... tutaj jest alternatywne podejście do uzyskania podobnych rzeczy ... ale jako struktura jest tylko
DynamicProperty
owinięta@State
(aby wymusić odświeżenie widoku).Jest to proste opakowanie, ale daje możliwość zawarcia dowolnych niestandardowych obliczeń przy kolejnym odświeżeniu widoku ... i, jak powiedziano, przy użyciu typów tylko wartościowych.
Oto wersja demonstracyjna (testowana z Xcode 11.2 / iOS 13.2):
Oto kod:
źródło