2013-12-08 5 views
4

У меня возникли проблемы с отображением MKAnnotationViews на карте MapKit. Я использую iOS 7 и теперь много раз просматриваю форумы и веб-сайты, пробуя разные образцы и настройки.MapKit Аннотации, не отображающиеся на карте

Ниже приведена самая простая настройка (я думаю), чтобы заставить ее работать. Приложение содержит один ViewController с панелью инструментов с кнопкой вверху, а остальное - MapView. Кнопка запускает метод zoomToUser: (UIBarButtonItem *) отправителя. Щелчок правой кнопкой мыши и проверка моих точек и делегатов кажутся правильными. У меня есть инструкции NSLog, которые запускаются для вывода некоторой информации об отладке.

Сначала 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: %f x %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 говорит мне, что у него есть аннотация, он запрашивает представление, он получает представление, но он не показывает его?

ответ

8

В viewForAnnotation код создает и возвращает MKAnnotationView для аннотаций типа Data.

Класс MKAnnotationView, по умолчанию, создает пустой вид.
То есть его image свойство nil и вид в основном не содержит содержания.
Итак, как есть, представления аннотаций создаются и добавляются, но они невидимы.

Вы можете:

  • Установите image свойство на MKAnnotationView:

    annov.image = [UIImage imageNamed:@"something"]; 
    
  • Или, проще создать MKPinAnnotationView вместо которой является удобным подкласс MKAnnotationView, который отображает контактный изображение для вас:

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


Unrelated:
Вы создали пользовательский класс аннотаций Data, который прекрасно, но если все, что нужно три свойства title, subtitle и coordinate, то вы можете просто использовать предопределенные 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]; 
+0

Большое вам спасибо! Я действительно не могу поверить, что я пропустил это ... Наверное, я не слишком внимательно смотрел на части кода, где настроены представления аннотаций. Что касается класса аннотаций: я собираю данные для контактов из основных данных, но я решил, что для вставки будет слишком много кода, но я хотел показать некоторые связанные части класса аннотации. Он фактически реализуется с использованием категорий поверх уже классифицированного подкласса NSManagedObject. Хотелось бы, чтобы я мог поддержать, но у меня нет репутации. Еще раз спасибо! – Canis

Смежные вопросы