SwiftUI MapKit display markers in a loop problem

74 Views Asked by At

From core data I generate data for map marker pins. When user selects a marker pin I display the data in a popup label with multiple rows, when I click on the pin. This is working for one marker pin. Now, I need to iterate over a list and generate several of those markers each with unique popup label data. The code:

struct MapView: UIViewRepresentable {
var annotationOnTap: (_ title: String) -> Void

@Binding var pins: [GpsData.MyEndPt]
let key: String

private static var mapViewStore = [String : MKMapView]()

func makeUIView(context: Context) -> MKMapView {
    if let mapView = MapView.mapViewStore[key] {
        mapView.delegate = context.coordinator
        return mapView
    }
    let mapView = MKMapView(frame: .zero)
    mapView.delegate = context.coordinator
    MapView.mapViewStore[key] = mapView
    return mapView
}

func updateUIView(_ uiView: MKMapView, context: Context) {
    uiView.addAnnotations(pins)
}

func makeCoordinator() -> MapCoordinator {
    MapCoordinator(self)
}


final class MapCoordinator: NSObject, MKMapViewDelegate {

    var parent: MapView
    init(_ parent: MapView) {
        self.parent = parent
    }
    


    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        let PINID:String = "MyEndPoint"
        var mPin: MKMarkerAnnotationView? = nil
        let subtitleView = UILabel()
        subtitleView.font = subtitleView.font.withSize(12)
        subtitleView.numberOfLines = 0
        
        if (mPin == nil ) {
            mPin = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: PINID)
            mPin?.canShowCallout = true
        } else{
            mPin?.annotation = annotation
        }
        mPin?.leftCalloutAccessoryView = nil
        let btn = UIButton(type: .detailDisclosure)
        mPin?.rightCalloutAccessoryView = btn
        
        let zip:String = "77065"
        let formattedSalesStr:String = "100"
        let totalTargetText:String = "500"
       
        let paddedLoad = formattedSalesStr.padding(toLength: 50, withPad: " ", startingAt: 0)
        let paddedCapacity = totalTargetText.padding(toLength: 50, withPad: " ", startingAt: 0)
        
        subtitleView.text = "Total sales: "
        subtitleView.text! += paddedLoad
        subtitleView.text! += " \r\n"
        subtitleView.text! += "Total Target: "
        subtitleView.text! += paddedCapacity
        subtitleView.text! += " \r\n"
        subtitleView.text! += paddedzip
        
        mPin!.detailCalloutAccessoryView = subtitleView
        
        return mPin!
    }

    
}

}

As you can see in the above method I have hardcoded values for my popup marker label. So I tried to iterate over the @Binding pins, populate each mPin, and return an array of MKAnnotationView, like this:

 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> [MKAnnotationView] {
        let PINID:String = "MyEndPoint"
        var i:Int = 1
        var mPins = [MKAnnotationView]()
        for detail in self.parent.pins {
            var mPin: MKMarkerAnnotationView? = nil
            let subtitleView = UILabel()
            subtitleView.font = subtitleView.font.withSize(12)
            subtitleView.numberOfLines = 0
            
            if (mPin == nil ) {
                mPin = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: PINID)
                mPin?.canShowCallout = true
            } else{
                mPin?.annotation = annotation
            }
            mPin?.leftCalloutAccessoryView = nil
            let btn = UIButton(type: .detailDisclosure)
            mPin?.rightCalloutAccessoryView = btn
            subtitleView.text! += String(i)
            subtitleView.text = "Total Load: "
            subtitleView.text! += String(detail.sales)
            subtitleView.text! += " \r\n"
            subtitleView.text! += "Total Target: "
            subtitleView.text! += String(detail.target)
            subtitleView.text! += " \r\n"
            i += 1
            // }
            
            mPin!.detailCalloutAccessoryView = subtitleView
            mPins.append(mPin!)

        }
        return mPins
    }

The marker pins show up, but then the label does not popup. How to fix this?

0

There are 0 best solutions below