1

我有一个问题,当用户单击标注时,CalloutAccessoryControlTapped 永远不会被调用。这在 Apple 地图中是否已删除或更改?

在 iOS 5 中,我的调用如下所示:

(图片) 餐厅名称/地址 >

当我点击呼叫时,我会得到一个对话框。在 iOS6 中,我的调用如下所示:

餐厅名称/地址

为什么我在 Apple 地图中的呼叫发生了变化?

这是它在 iOS 6 中的样子:

Apple 地图是否删除了 CalloutAccessControlTapped 功能?

这是我的代码:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.MapKit;
using MonoTouch.CoreLocation;
using System.Linq;
using MenuFinderAN.BusinessLogic.MenuFinderServiceReference;
using System.Collections.Generic;

namespace MenuFinderMT
{
public partial class MapUniversalController : UIViewController
{
    static bool UserInterfaceIdiomIsPhone {
        get { return UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone; }
    }

    public AppDelegate AppDelegate { get; set; }

    public List<IGrouping<string, RestaurantLocation>> LocationList { get; set; }

    public MapUniversalController (List<IGrouping<string, RestaurantLocation>> locationList)
        : base (UserInterfaceIdiomIsPhone ? "MapUniversalController_iPhone" : "MapUniversalController_iPad", null)
    {
        LocationList = locationList;
    }

    public override void DidReceiveMemoryWarning ()
    {
        // Releases the view if it doesn't have a superview.
        base.DidReceiveMemoryWarning ();

        // Release any cached data, images, etc that aren't in use.
    }

    MKMapView mapView;

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        AppDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
        Title = "Locations";

        mapView = new MKMapView (View.Bounds);  
        mapView.AutoresizingMask = UIViewAutoresizing.FlexibleDimensions;       
        //mapView.MapType = MKMapType.Standard; // this is the default
        //mapView.MapType = MKMapType.Satellite;
        //mapView.MapType = MKMapType.Hybrid;
        View.AddSubview (mapView);

        List<RestaurantLocation> locations = LocationList.SelectMany (x => x).ToList ();

        // create our location and zoom 

        double lat = 0;
        double lng = 0;

        foreach (RestaurantLocation loc in locations) {
            if (loc.Latitude > 0 && lat == 0) {
                lat = loc.Latitude;
                lng = loc.Longitude;
            }

            // add a basic annotation
            var annotation = new BasicMapAnnotation (new CLLocationCoordinate2D (loc.Latitude, loc.Longitude), loc.Name, loc.Address + ", " + loc.City);
            mapView.AddAnnotation (annotation);
        }

        CLLocationCoordinate2D coords = new CLLocationCoordinate2D (lat, lng); 

        MKCoordinateSpan span = new MKCoordinateSpan (MilesToLatitudeDegrees (20), MilesToLongitudeDegrees (20, coords.Latitude));

        // set the coords and zoom on the map
        mapView.Region = new MKCoordinateRegion (coords, span);


        // assign the delegate, which handles annotation layout and clicking
        mapView.Delegate = new MapDelegate (this, locations);


    }

    /// <summary>
    /// Converts miles to latitude degrees
    /// </summary>
    public double MilesToLatitudeDegrees (double miles)
    {
        double earthRadius = 3960.0;
        double radiansToDegrees = 180.0 / Math.PI;
        return (miles / earthRadius) * radiansToDegrees;
    }

    /// <summary>
    /// Converts miles to longitudinal degrees at a specified latitude
    /// </summary>
    public double MilesToLongitudeDegrees (double miles, double atLatitude)
    {
        double earthRadius = 3960.0;
        double degreesToRadians = Math.PI / 180.0;
        double radiansToDegrees = 180.0 / Math.PI;

        // derive the earth's radius at that point in latitude
        double radiusAtLatitude = earthRadius * Math.Cos (atLatitude * degreesToRadians);
        return (miles / radiusAtLatitude) * radiansToDegrees;
    }

    public override void ViewDidUnload ()
    {
        base.ViewDidUnload ();

        // Clear any references to subviews of the main view in order to
        // allow the Garbage Collector to collect them sooner.
        //
        // e.g. myOutlet.Dispose (); myOutlet = null;

        ReleaseDesignerOutlets ();
    }
}

// The map delegate is much like the table delegate.
class MapDelegate : MKMapViewDelegate
{
    protected string annotationIdentifier = "BasicAnnotation";
    MapUniversalController mapUniversalController;
    List<RestaurantLocation> locations;

    public MapDelegate (MapUniversalController mapUniversalController, List<RestaurantLocation> locations)
    {
        this.mapUniversalController = mapUniversalController;
        this.locations = locations;
    }

    /// <summary>
    /// This is very much like the GetCell method on the table delegate
    /// </summary>
    public override MKAnnotationView GetViewForAnnotation (MKMapView mapView, NSObject annotation)
    {
        // try and dequeue the annotation view
        MKAnnotationView annotationView = mapView.DequeueReusableAnnotation (annotationIdentifier);

        // if we couldn't dequeue one, create a new one
        if (annotationView == null)
            annotationView = new MKPinAnnotationView (annotation, annotationIdentifier);
        else // if we did dequeue one for reuse, assign the annotation to it
            annotationView.Annotation = annotation;

        // configure our annotation view properties
        annotationView.CanShowCallout = true;
        (annotationView as MKPinAnnotationView).AnimatesDrop = true;
        (annotationView as MKPinAnnotationView).PinColor = MKPinAnnotationColor.Green;
        annotationView.Selected = true;

        // you can add an accessory view, in this case, we'll add a button on the right, and an image on the left
        annotationView.RightCalloutAccessoryView = UIButton.FromType (UIButtonType.DetailDisclosure);

        annotationView.LeftCalloutAccessoryView = new UIImageView (UIImage.FromBundle ("Images/Icons/MenuFinder_Logo-29x29.png"));

        return annotationView;
    }

    public override void CalloutAccessoryControlTapped (MKMapView mapView, MKAnnotationView view, UIControl control)
    {
        var annotation = view.Annotation;
        var coords = (annotation as MKAnnotation).Coordinate;
        RestaurantLocation restaurantLocation = locations.Where (a => a.Latitude == coords.Latitude && a.Longitude == coords.Longitude).FirstOrDefault ();
        UIAlertView alertt = new UIAlertView ("Directions?", "Would you like directions?", null, "Yes", null);
        alertt.AddButton ("No");
        alertt.Clicked += delegate(object sender, UIButtonEventArgs e) {
            if (e.ButtonIndex == 0) {
                double slat = (double)mapUniversalController.AppDelegate.Latitude;
                double slng = (double)mapUniversalController.AppDelegate.Longitude;
                string saddr = slat.ToString () + "," + slng.ToString ();
                string daddr = coords.Latitude.ToString () + "," + coords.Longitude.ToString ();
                NSUrl url = new NSUrl ("http://maps.google.com/maps?saddr=" + saddr + "&daddr=" + daddr);
                UIApplication.SharedApplication.OpenUrl (url);
            } else {
                mapUniversalController.AppDelegate.CurrentRestaurantLocation = restaurantLocation;
                // Pass the selected object to the new view controller.
                mapUniversalController.NavigationController.PushViewController (new RestaurantDetailsUniversalController (), true);
            }
        };
        alertt.Show ();


    }

    // as an optimization, you should override this method to add or remove annotations as the 
    // map zooms in or out.
    public override void RegionChanged (MKMapView mapView, bool animated)
    {
    }
}

class BasicMapAnnotation : MKAnnotation
{
    /// <summary>
    /// The location of the annotation
    /// </summary>
    public override CLLocationCoordinate2D Coordinate { get; set; }

    protected string title;
    protected string subtitle;

    /// <summary>
    /// The title text
    /// </summary>
    public override string Title
    { get { return title; } }


    /// <summary>
    /// The subtitle text
    /// </summary>
    public override string Subtitle
    { get { return subtitle; } }

    public BasicMapAnnotation (CLLocationCoordinate2D coordinate, string title, string subTitle)
        : base()
    {
        this.Coordinate = coordinate;
        this.title = title;
        this.subtitle = subTitle;
    }
}

}

4

1 回答 1

5

代理处理行为在 iOS 6 中略有改变。请确保在添加任何注释之前分配 MapDelegate。

编辑:参见规则#2在设置属性或使用实例之前设置委托或所有事件(博客详细说明了为什么它很重要,而不仅仅是在 MonoTouch 中)

于 2012-10-04T19:18:28.807 回答