Abishek P Rao
Abishek P Rao

Reputation: 3

MkMaview is null in iOS custom renderer in Xamarin forms

Im trying to custom renderer the map in iOS and all Im getting is null reference exception from line(var nativeMap = Control as MKMapView) saying that native map is null.Please can anyone one give me a good solution for this.

[assembly: ExportRenderer(typeof(CustomMap), typeof(CustomMapRenderer))]

namespace MapOverlay.iOS
{
    public class CustomMapRenderer : MapRenderer
    {
        MKPolylineRenderer polylineRenderer;
        protected override void OnElementChanged(ElementChangedEventArgs<View> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null) {
                var nativeMap = Control as MKMapView;
                if (nativeMap != null) {
                    nativeMap.RemoveOverlays(nativeMap.Overlays);
                    nativeMap.OverlayRenderer = null;
                    polylineRenderer = null;
                }
            }

            if (e.NewElement != null) {
                var formsMap = (CustomMap)e.NewElement;
                var nativeMap = Control as MKMapView;
                nativeMap.OverlayRenderer = GetOverlayRenderer;

                CLLocationCoordinate2D[] coords = new CLLocationCoordinate2D[formsMap.RouteCoordinates.Count];
                int index = 0;
                foreach(var position in formsMap.RouteCoordinates)
                {
                    coords[index] = new CLLocationCoordinate2D(position.Latitude, position.Longitude);
                    index++;
                }

                var routeOverlay = MKPolyline.FromCoordinates(coords);
                nativeMap.AddOverlay(routeOverlay);
            }
        }
    }
}

Upvotes: 0

Views: 333

Answers (1)

Artem Tishchenko
Artem Tishchenko

Reputation: 340

You must set native control

  protected override void OnElementChanged(ElementChangedEventArgs<View> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                SetNativeControl(new MKMapView(RectangleF.Empty));
            }
}

Upvotes: 1

Related Questions