MKMapView - перетаскиваемый контакт вызывает ошибку при падении? - PullRequest
2 голосов
/ 02 февраля 2011

Кто-нибудь сталкивался с этой ошибкой (см. Ниже). Это происходит, когда я перетаскиваю булавку в MKMapView, а затем удаляю ее ... при падении приложения происходит сбой. В моей реализации MKAnnotation тоже есть получатель / установщик для Coordinate !!!?

System.Exception: Failed to find selector _original_setCoordinate: on DivineiPhone.FoundAnnotation
  at MonoTouch.ObjCRuntime.Runtime.GetMethod (IntPtr klass, IntPtr selptr) [0x0001c] in /Users/plasma/Source/iphone/monotouch/ObjCRuntime/Runtime.cs:127
  at (wrapper native-to-managed) MonoTouch.ObjCRuntime.Runtime:GetMethod (intptr,intptr)
  at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:26
  at DivineiPhone.Application.Main (System.String[] args) [0x00000] in /Users/stevepthornton/Projects/DivineiPhone/DivineiPhone/Classes/Main.cs:15

Спасибо за любую помощь ... я понятия не имею, что происходит: (

Steve

Вот мой код ...

public class FoundAnnotation : MKAnnotation
    {
        private CLLocationCoordinate2D coordinate;

    private string _title, _subtitle;
    private bool _clickThru;
    private string _desc;

    public override CLLocationCoordinate2D Coordinate 
    {
        set { coordinate = value; }
        get { return coordinate; }
    }

    public override string Title 
    {
        get { return _title; }
    }

    public override string Subtitle 
    {
        get { return _subtitle; }
    }

    public bool ClickThru 
    {
        get { return _clickThru; }
        set { _clickThru = value; }
    }

    public string Description 
    {
        get { return _desc; }
        set { _desc = value; }
    }

public FoundAnnotation (CLLocationCoordinate2D coord, string t, string s, bool click, string description) : base()
{

        coordinate=coord;
        _title=t; 
        _subtitle=s;
        _clickThru = click;
        _desc = description;
    }
}

public override MKAnnotationView GetViewForAnnotation (MKMapView mapView, NSObject annotation)
        {   
            try
            {
                if (annotation is MKUserLocation)
                {

                return null; //default to blue dot
            }
            else if (annotation is FoundAnnotation)
            {
                MKPinAnnotationView pinanv = new MKPinAnnotationView(annotation, "thislocation");
                pinanv.AnimatesDrop = true;
                pinanv.PinColor = MKPinAnnotationColor.Green;

                FoundAnnotation customAnnotation = (FoundAnnotation)annotation;
                pinanv.CanShowCallout = true;

                UIButton rightCallout = UIButton.FromType(UIButtonType.ContactAdd);
                rightCallout.Frame = new System.Drawing.RectangleF(250, 8f, 25f, 25f);

                rightCallout.TouchDown += delegate {
                    addStore = new AddStoreViewController(this, customAnnotation, mapView);
                    _svc.NavigationController.PushViewController(addStore, true);
                };

                pinanv.RightCalloutAccessoryView = rightCallout;
                pinanv.Draggable = true;

                return pinanv;
            }
            else if (annotation is StoreAnnotation)
            {
                MKPinAnnotationView pinanv = new MKPinAnnotationView(annotation, "thislocation");
                pinanv.AnimatesDrop = true;
                pinanv.Image = UIImage.FromFile("Images/MapPin.png");
                pinanv.CanShowCallout = true;

                return pinanv;
            }

            return null;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Это все еще происходит в MonoTouch 5.2.5.Как объяснялось ранее, следующий код исправляет это:

public override CLLocationCoordinate2D Coordinate 
{ 
    get 
    { 
        return this.coordinate; 
    }
    set
    {
        this.SetCoordinate(value);
    }
}

[Export("_original_setCoordinate:")]
public void SetCoordinate(CLLocationCoordinate2D coord)
{
    this.WillChangeValue("coordinate");
    this.coordinate = coord;
    this.DidChangeValue("coordinate");
}
0 голосов
/ 01 марта 2012

Начиная с MonoTouch 5.2.5, эта ошибка все еще существует. Вышеупомянутая ошибка все еще существует, и обходной путь (export _original_setCoordinate :) исправит это.

0 голосов
/ 08 августа 2011

Это была проблема переименования селектора (во время выполнения). Более подробная информация (и тестовый пример) доступны здесь .

Исправление будет доступно в MonoTouch 4.1.

...