MKMapView - Draggable引脚会导致丢失错误?

时间:2011-02-02 19:10:22

标签: c# ios xamarin.ios mkmapview selector

有没有人遇到过这个错误(见下文)。当我在MKMapView中拖动一个引脚然后放下它时,它会发生...当放下应用程序崩溃时。我的MKAnnotation实现确实有一个坐标的getter / setter !!!?

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

感谢您提供任何帮助......我不知道发生了什么:(

史蒂夫

这是我的代码......

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 个答案:

答案 0 :(得分:1)

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");
}

答案 1 :(得分:0)

这是一个重命名(在运行时)问题的选择器。更多细节(和测试用例)可用here

此修复程序将在MonoTouch 4.1中提供。

答案 2 :(得分:0)

从MonoTouch 5.2.5开始,此错误仍然存​​在。上面的错误仍然存​​在,解决方法(export _original_setCoordinate :)将修复它。