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, прежде чем добавить некоторые аннотации.