MKMapView Аннотация setCoordinate сбой приложения - PullRequest
0 голосов
/ 09 июня 2011

Я работаю над простым GPS-приложением. Я создал пользовательский объект, который расширяет MKAnnotation, который также отлично работает. Я могу поместить его и т. Д., Но если я добавлю этот фрагмент кода [mpm setCoordinate:loc]; в мой код, приложение откроется и зависнет, показывая основную серую сетку (не будет отображаться ни загруженная карта, ни мои кнопки)

Вот мой заголовок:

@interface FirstViewController : UIViewController <MKMapViewDelegate>
{
    IBOutlet MKMapView *mapView;
    MyPlaceMark *mpm;
}
-(void)locationUpdate:(CLLocation *)location;
-(void)locationError:(NSError *)error;
@end

А вот фрагмент кода, где я пытаюсь обновить вещи:

-(void)locationUpdate:(CLLocation *)location
{
    CLLocationCoordinate2D loc = [location coordinate];
    [mpm setCoordinate:loc]; // This line messes it up.
    [mapView setCenterCoordinate:loc];
    if([mapView showsUserLocation] == NO)
         [mapView setShowsUserLocation:YES]; // This does not show my position either?
}

Если я прокомментирую эту строку, приложение работает нормально. Мне нужно обновить аннотацию, так как она будет моим маркером для отображения текущего местоположения пользователей. PS: без этой строки он действительно центрирует мое представление - поэтому location является допустимой / установленной переменной.

Мой viewDidLoad выглядит так:

- (void)viewDidLoad {
    mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
    //mapView.showsUserLocation = YES;
    [mapView setShowsUserLocation:YES];
    mapView.mapType = MKMapTypeStandard;
    mapView.delegate = self;
    CLLocationCoordinate2D location;
    MKCoordinateRegion region;
    location.latitude = -33.8;
    location.longitude = 18.6;
    MKCoordinateSpan span;
    span.latitudeDelta = 0.01;
    span.longitudeDelta = 0.01;
    region.span = span;
    region.center = location;
    [mapView setRegion:region animated:TRUE];
    [mapView regionThatFits:region];
    mpm = [[MyPlaceMark alloc] initWithCoordinate:location]; // Creating mpm
    [mapView addAnnotation:mpm]; // Adding mpm
    [self.view addSubview:mapView];
    [super viewDidLoad];
}

Должен ли я повторно добавить mpm после того, как изменил его местоположение? Или он просто перескочит на новое место на карте?

Итак, напомним вопрос: как я могу обновить пользовательское местоположение MKAnnotation в моем просмотре карты?

Спасибо за ваше время!

РЕДАКТИРОВАТЬ: Я думаю, что основной причиной сбоя является тот факт, что я не создаю метод / функцию setCoordinate в моем пользовательском MKAnnotation. Как бы я переопределил это, но сохранить его таким же, как оригинал?

Ошибка в лог-консоли:

2011-06-09 14:42:40.377 AeroNav[3706:707] -[MyPlaceMark setCoordinate:]: unrecognized selector sent to instance 0x19e0e0
2011-06-09 14:42:40.493 AeroNav[3706:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyPlaceMark setCoordinate:]: unrecognized selector sent to instance 0x19e0e0'
...
terminate called after throwing an instance of 'NSException'

1 Ответ

0 голосов
/ 09 июня 2011

[mapView setShowsUserLocation:YES] не обновляет регион, который отображается на карте.Вам нужно будет реализовать методы делегата didUpdateUserLocation: и вызвать setRegion:animated:, чтобы переместить регион в местоположение пользователя.Пока этот вызов не вызывается впервые, свойство userLocation для MKMapView не устанавливается.

Что касается MKAnnotation, MKAnnotation - это протокол.У него нет реализации по умолчанию.Вы должны будете предоставить все методы и свойства, которым вы согласились соответствовать.Поэтому объявите свойство, очень похожее на свойство в протоколе MKAnnotation.

...