开发者

MKMapView - Draggable pin causes error on drop?

开发者 https://www.devze.com 2023-02-08 08:35 出处:网络
Has anyone come across this error (see below). It happens when i drag a pin within a MKMapView and then drop it... when dropped the app crashes. My implementation of MKAnnotation does have a getter/se

Has anyone come across this error (see below). It happens when i drag a pin within a MKMapView and then drop it... when dropped the app crashes. My implementation of MKAnnotation does have a getter/setter for Coordinate too!!!?

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

Thanks for any help... i 开发者_开发百科dont have a clue whats happening :(

Steve

Here's my code...

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


This is still happening on MonoTouch 5.2.5. As explained before the following code fixes it:

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


This was a selector being renamed (at runtime) issue. More details (and a test case) are available here.

The fix will be available in MonoTouch 4.1.


As of MonoTouch 5.2.5, this bug does still exist. The above bug still exists and the workaround (export _original_setCoordinate:) will fix it.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号