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