MapKit注解没有显示在地图上

我无法在MapKit的地图上显示MKAnnotationViews。 我正在使用iOS 7,现在已经在论坛和网上search了很多小时,尝试了不同的样本和设置。

下面我有最基本的设置可能(我认为)使其工作。 该应用程序包含一个单独的ViewController,顶部有一个button,剩下的就是MapView。 该button触发方法zoomToUser:(UIBarButtonItem *)发件人。 右键点击并检查我的网点和代表似乎是正确的。 我有一些NSLog语句被触发输出一些debugging信息。

首先是VC:

#import "ViewController.h" #import "Data.h" @interface ViewController () <MKMapViewDelegate> @property (weak, nonatomic) IBOutlet MKMapView *mapView; - (IBAction)zoomToUser:(UIBarButtonItem *)sender; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.mapView.showsUserLocation = YES; Data *ann = [[Data alloc] init]; [self.mapView addAnnotation:ann]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self zoomToUser:nil]; } -(IBAction)zoomToUser:(UIBarButtonItem *)sender { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.userLocation.coordinate, 2000, 2000); NSLog(@"region: %fx %f",self.mapView.userLocation.coordinate.latitude,self.mapView.userLocation.coordinate.longitude); [self.mapView setRegion:region animated:YES ]; NSArray *arr = self.mapView.annotations; for(int i = 0, max = arr.count; i < max; i++) { id<MKAnnotation> annotation = arr[i]; NSLog(@"%d of %d: %@ (%@)",i+1,max,annotation.title, [annotation class]); } } - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation { NSString *reuseId = @"Test"; if([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } else if( [annotation isKindOfClass:[Data class]]) { MKAnnotationView *annov = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; if(!annov) { annov = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:reuseId]; } else { annov.annotation = annotation; } annov.canShowCallout = YES; NSLog(@"Title: %@",annotation.title); return annov; } else { return nil; } } @end 

Data类:

 #import "Data.h" @implementation Data -(NSString *)title { return @"The title"; } -(NSString *)subtitle { return @"A subtitle"; } -(CLLocationCoordinate2D)coordinate { CLLocationCoordinate2D coordinate; coordinate.latitude = 60.123456; coordinate.longitude = 10.123456; return coordinate; } @end 

Data.h:

 #import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface Data : NSObject <MKAnnotation> @end 

和ViewController.h:

 #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> @interface ViewController : UIViewController @end 

正如你所看到的viewForAnnotation – 方法在请求时在控制台中打印注释标题,并且每次地图平移该区域时,它都会打印。

按下BarButton并触发zoomToUser: – 方法日志来控制地图确实有两个注释, MKUserLocation和我添加的。

我的MapView如何告诉我它有注释,它要求视图,它获取视图,但它不显示它?

viewForAnnotation ,代码创build并返回一个MKAnnotationView用于Datatypes的注释。

MKAnnotationView类默认创build一个空视图。
也就是说,它的image属性是nil ,而视图基本上不包含内容。
因此,注释视图正在被创build和添加,但是它们是不可见的。

你可以:

  • MKAnnotationView上设置image属性:

     annov.image = [UIImage imageNamed:@"something"]; 
  • 或者,更简单的,创build一个MKPinAnnotationView而不是MKPinAnnotationView一个方便的子类,它为您显示一个针图像:

     MKPinAnnotationView *annov = (MKPinAnnotationView *)[mapView dequeue... if(!annov) { annov = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:reuseId]; annov.pinColor = MKPinAnnotationColorRed; //or Green or Purple } else ... 

无关
你已经创build了一个自定义注释类Data ,但是如果你所需要的只是三个属性titlesubtitlecoordinate ,那么你可以使用预定义的MKPointAnnotation类来设置每个实例的所有属性:

 MKPointAnnotation *ann = [[MKPointAnnotation alloc] init]; ann.title = @"The title"; ann.subtitle = @"A subtitle"; ann.coordinate = CLLocationCoordinate2DMake (60.123456, 10.123456); [self.mapView addAnnotation:ann];