2

I have an issue to customize a Mapbox view's style, like for instance adding some information on the map if a switch is switched on. Not sure if it's important, but the layers I need to add are MGLSymbolStyleLayer and MGLLineStyleLayer.

Let's start with code for the main view containing a switch representing a state used to customize the map's style, and an UIViewRepresentable for the Mapbox view.

struct Test_MapBox: View {
    @State private var styleURL: URL = MGLStyle.outdoorsStyleURL
    @State private var switchButton: Bool = false
    
    var body: some View {
        ZStack(alignment: .bottom) {
            MapView(switchButton: switchButton)
                .styleURL(styleURL)
                .edgesIgnoringSafeArea(.all)

            Toggle(isOn: $switchButton, label: {
                Text("Switch")
            })

        }            
    }
}

struct MapView: UIViewRepresentable {
    var switchButton: Bool
    var mapView = MGLMapView(frame: .zero)
        
    func makeUIView(context: UIViewRepresentableContext<MapView>) -> MGLMapView {
        mapView.delegate = context.coordinator
        return mapView
    }
    
    func updateUIView(_ uiView: MGLMapView, context: UIViewRepresentableContext<MapView>) {
        print("Style: \(uiView.style)")
        print("Update view, switch: \(switchButton)")
    }
    
    func makeCoordinator() -> MapView.Coordinator {
        Coordinator(self)
    }
        
    func styleURL(_ styleURL: URL) -> MapView {
        mapView.styleURL = styleURL
        return self
    }
        
    final class Coordinator: NSObject, MGLMapViewDelegate {
        var parent: MapView
        
        init(_ control: MapView) {
            self.parent = control
        }
        
        func mapViewDidFinishLoadingMap(_ mapView: MGLMapView) {
            print("Map loaded, switch: \(parent.switchButton)")
        }
        
        func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {
            print("Style loaded, switch: \(parent.switchButton)")
        }
    }
}

The issue is the following: inside the delegate functions, switchButton is never up to date, always false (and I don't understand why)... And in updateUIView(), switchButton is OK, but the style is not yet loaded, so usually you get a nil when accessing it ...

Have you got a solution ?

Julien_Fr
  • 21
  • 4

0 Answers0