GetViewForAnnotation никогда не вызывается

Я создаю MapView, где я хочу отображать некоторые пользовательские аннотации.

Поэтому я думаю, что обычно вы добавляете IMKAnnotation к MKMapView с использованием AddAnnotation метод. Я уверен, что вызывать это в основном потоке, как:

new NSObject().InvokeOnMainThread(() => {
    _mapView.AddAnnotation(myNewAnnotation);
});

После того, как они добавлены, я вижу, что MKMapView теперь содержит все аннотации, которые я добавил в Annotations свойство при проверке с помощью отладчика.

Однако проблема в том, что GetViewForAnnotation никогда не вызывается, независимо от того, как я это делаю.

Я пробовал:

_mapView.GetViewForAnnotation += ViewForAnnotation;

private MKAnnotationView ViewForAnnotation(MKMapView mapView, IMKAnnotation annotation) {
    // do stuff here
}

Я попытался реализовать свой собственный делегат:

public class MyMapViewDelegate : MKMapViewDelegate
{
    public override MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation) {
        // do stuff
    }
}

_delegate = new MyMapViewDelegate();
_mapView.Delegate = _delegate;

Я пытался использовать WeakDelegate:

public class MapView : ViewController, IMKMapViewDelegate
{
    private MKMapView _mapView;

    public override void ViewDidLoad() {
        _mapView = new MKMapView();
        _mapView.WeakDelegate = this;
    }

    [Export("mapView:viewForAnnotation:")]
    public MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation) {
        // do stuff
    }
}

Ничто, кажется, не вызывает GetViewForAnnotation метод. Есть идеи, что я делаю не так?

РЕДАКТИРОВАТЬ:

Немного подробнее, что у меня сейчас.

[Register("MapView")]
public class MapView : MvxViewController<MapViewModel>
{
    private MKMapView _mapView;
    private NMTAnnotationManager _annotationManager;

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        _mapView = new MKMapView();
        _mapView.GetViewForAnnotation += GetViewForAnnotation;
        _annotationManager = new NMTAnnotationManager(_mapView);

        var bindSet = this.CreateBindingSet<MapView, MapViewModel>();
        bindSet.Bind(_annotationManager).For(a => a.ItemsSource).To(vm => vm.Locations).OneWay();
        bindSet.Apply();

        Add(_mapView);

        View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();

        View.AddConstraints(
            _mapView.AtTopOf(View),
            _mapView.AtLeftOf(View),
            _mapView.AtRightOf(View),
            _mapView.AtBottomOf(View));
    }

    private MKAnnotationView GetViewForAnnotation(MKMapView mapview, IMKAnnotation annotation)
    {
        return null;
    }
}

NMTAnnotationManager просто слабый подписывается на INotifyCollectionChanged событие ObservableCollection который используется как ItemsSource в обязательном порядке. Когда коллекция изменяется, она просто добавляет и удаляет аннотации из MKMapViewНичего волшебного здесь не происходит. Я убедился, что он действительно добавляет, в этом случае 13, разные IMKAnnotation экземпляры к MKMapView и они могут быть проверены в Annotations свойство этого.

Так как @Philip предложил в своем ответе, GetViewForAnnotation устанавливается до того, как аннотации добавляются в MapView. Но если я добавлю точку останова или какой-либо след в методе, он никогда не получит удар.

Тот же код выше, просто с простым MKMapViewDelegate вот так:

public class MyMapViewDelegate : MKMapViewDelegate
{
    public override void MapLoaded(MKMapView mapView)
    {
        Mvx.Trace("MapLoaded");
    }

    public override MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation)
    {
        Mvx.Trace("GetViewForAnnotation");
        return null;
    }
}

Тоже не работает. Хотя MapLoaded событие получает удар каждый раз при рендеринге карты, но почему GetViewForAnnotation не попасть?

2 ответа

Решение

ОК, так что, очевидно, проблема была в PEBKAC.

Аннотация действительно добавлена ​​к MKMapView, Однако ни у кого из них не было Coordinate набор свойств. Поэтому, очевидно, карта не знала, где их подарить и никогда не звонила GetViewForAnnotation,

Я делаю это так:

  • Раскадровка с ViewController, который содержит MKMapView
  • MKMapView Делегат ViewController устанавливается в IB в Инспекторе соединений

В ViewDidLoad Я уверен, что я установил это первым: mapView.GetViewForAnnotation += GetViewForAnnotation;

У меня были проблемы с тем, что он никогда не вызывался, и я исправил это, убедившись, что я установил событие для GetViewForAnnotation, прежде чем добавить некоторые аннотации.

Другие вопросы по тегам