Кнопка MKAnnotationView RightCallOut приводит к сбою приложения при нажатии на него - PullRequest
1 голос
/ 02 ноября 2011

Я звоню в службу и возвращаю набор широт и долгот, которые затем помещаю на карту с помощью MapKit.

используя MKAnnotationView Я добавляю RightCallOutButton к каждой аннотации.

Итак, мне пришлось создать новый MapDelegate. Код ниже.

Если я нажимаю на кнопку, то при создании приложения происходит сбой, и MonoTouch выдает ошибку, в которой говорится, что селектор получает доступ ко всему, что уже было обработано GC (сборка мусора).

Так что мой вопрос будет таким: где я должен установить RightCalloutAccessoryView и где я должен создать кнопку, если не в этом коде ниже?

public class MapDelegage : MKMapViewDelegate {

     protected string _annotationIdentifier = "BasicAnnotation";
     public override MKAnnotationView GetViewForAnnotation (MKMapView mapView,                           NSObject annotation) {

MKAnnotationView annotationView = mapView.DequeueReusableAnnotation(this._annotationIdentifier);


if(annotationView == null) {
     annotationView = new MKPinAnnotationView(annotation, this._annotationIdentifier);
}  else {
    annotationView.Annotation = annotation;
}


annotationView.CanShowCallout = true;
(annotationView as MKPinAnnotationView).AnimatesDrop = true;    
(annotationView as MKPinAnnotationView).PinColor = MKPinAnnotationColor.Green;
annotationView.Selected = true;    
var button = UIButton.FromType(UIButtonType.DetailDisclosure);
button.TouchUpInside += (sender, e) => {
new UIAlertView("Testing", "Testing Message", null, "Close", null).Show ();
} ;

annotationView.RightCalloutAccessoryView = button;
return annotationView;
}

}

1 Ответ

1 голос
/ 02 ноября 2011
annotationView = new MKPinAnnotationView(annotation, this._annotationIdentifier);
...
var button = UIButton.FromType(UIButtonType.DetailDisclosure);

Вы должны избегать объявления локальных переменных для хранения ссылок, которые, как вы ожидаете, переживут сам метод. Если нет ссылки на annotationView или button, сборщик мусора (GC) может свободно собирать их (управляемую часть), даже если его собственные аналоги все еще существуют. Однако при вызове к ним вы получите сбой.

Самое простое решение - сохранить их список и (на уровне класса, то есть поле List<MKPinAnnotationView>) очистить список при уничтожении представления. UIButton не должно быть необходимым, поскольку существует ссылка между представлением и им.

ПРИМЕЧАНИЕ: ведется работа по сокрытию этой сложности от разработчиков в будущих версиях MonoTouch. К сожалению, вы не можете игнорировать такие проблемы в данный момент.

...