Как упомянул @SorinLica в комментарии, в настоящее время Вложенный ObservableObjects
не работает в SwiftUI .
Вероятно, самый простой подход - добавить объект Configure
непосредственно к среде (это класс, поэтому это будет тот же экземпляр, на который ссылается ваш экземпляр UserData
).
В вашем SceneDelegate
-
let userData = UserData()
let contentView = MapHome().environmentObject(userData).environmentObject(userData.configure)
Тогда выможете использовать его в своем MapHome
struct MapHome: View
{
@EnvironmentObject var userData: UserData
@EnvironmentObject var configure: Configure
NavigationView
{
ZStack
{
MapView(mapViewState: $configure.mapType)
.edgesIgnoringSafeArea(.all)
}
Button(action: {
switch self.userData.configure.mapType
{
case .hybrid:
self.userData.configure.mapType = .standard
case .standard:
self.userData.configure.mapType = .satellite
case .satellite:
self.userData.configure.mapType = .hybrid
default:
self.userData.configure.mapType = .standard
}
}
)
{
if self.userData.configure.mapType == .hybrid
{
Image("HybridIcon")
}
else if self.userData.configure.mapType == .standard
{
Image("StandardIcon")
}
else if self.userData.configure.mapType == .satellite
{
Image("SatelliteIcon")
}
}
}
}
Вашему MapView
понадобится mapType
как @Binding
-
struct MapView: UIViewRepresentable
{
@Binding var mapType: MKMapType
func makeUIView(context: Context) -> MKMapView
{
return MKMapView(frame: .zero)
}
func updateUIView(_ view: MKMapView, context: Context)
{
//Set the map type
view.mapType = mapType
}
}
Другим подходом было бы отразить картувведите @State
свойство в вашем MapHome
struct MapHome: View
{
@EnvironmentObject var userData: UserData
@State var mapType: MKMapType
NavigationView
{
ZStack
{
MapView(mapViewState: $mapType)
.edgesIgnoringSafeArea(.all)
}
Button(action: {
switch self.userData.configure.mapType
{
case .hybrid:
self.userData.configure.mapType = .standard
case .standard:
self.userData.configure.mapType = .satellite
case .satellite:
self.userData.configure.mapType = .hybrid
default:
self.userData.configure.mapType = .standard
}
self.mapType = self.userdata.configure.mapType
}
)
{
if self.userdata.configure.mapType == .hybrid
{
Image("HybridIcon")
}
else if self.userdata.configure.mapType == .standard
{
Image("StandardIcon")
}
else if self.userdata.configure.mapType == .satellite
{
Image("SatelliteIcon")
}
}
}
}
Вам нужно будет указать начальное значение для вашего типа карты в SceneDelegate
let userData = UserData()
let contentView = MapHome(mapType: userData.configure.mapType).environmentObject(userData)