Нельзя использовать разные имена для методов делегата для каждого используемого вами экземпляра диспетчера местоположений.Каждый менеджер местоположения по-прежнему будет вызывать методы, определенные протоколом CLLocationManagerDelegate
.
Вы можете проверить, какой менеджер вызывает, проверив, равен ли параметр manager
одному из экземпляров.вы создаете (например, if (manager == locationManagerMori)
).
Но вам не нужно создавать отдельный экземпляр диспетчера местоположений для каждой аннотации.
Вместо этого сохраняйтетолько один экземпляр диспетчера местоположений, и в методе делегата вы можете узнать, что такое текущая выбранная аннотация, и использовать ее координаты в строке URL.Например:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if (newLocation.horizontalAccuracy == oldLocation.horizontalAccuracy)
//the above if-condition looks a little suspicious by the way
{
if (mapView.selectedAnnotations.count == 0)
{
//no annotation selected, do nothing
return;
}
//there can only be one selected annotation so get the one at index 0
id<MKAnnotation> selectedAnnotation =
[mapView.selectedAnnotations objectAtIndex:0];
[self->locationManager stopUpdatingLocation];
CLLocationCoordinate2D coords = newLocation.coordinate;
NSString *stringURL = [NSString stringWithFormat:
@"http://maps.google.com/maps?saddr=%g,%g&daddr=%g,%g",
coords.latitude, coords.longitude,
selectedAnnotation.coordinate.latitude,
selectedAnnotation.coordinate.longitude];
NSURL *url = [NSURL URLWithString:stringURL];
//stop updating location to avoid possible endless loop
//when user comes back to this app...
[manager stopUpdatingLocation];
[[UIApplication sharedApplication] openURL:url];
}
}
Вам также не нужен отдельный метод действия кнопки для каждой аннотации.Вы можете просто создать метод действия одной кнопкой и использовать ту же технику, чтобы получить выбранную аннотацию.
Другая проблема заключается в методе просмотра предупреждений clickedButtonAtIndex
.Похоже, вы проверяете, какая это аннотация, посмотрев на индекс кнопки представления предупреждений.Этим индексом будет кнопка Annulla или Calcola (а не какая аннотация).
Поскольку вам не нужно создавать отдельный диспетчер местоположений для каждой аннотации, вам не нужно будет знать, какая аннотация для просмотра предупрежденийдля.Вам просто нужно проверить, нажал ли пользователь Annulla или Calcola:
if (buttonIndex == alertView.firstOtherButtonIndex)
{
self->locationManager = [[CLLocationManager alloc] init];
self->locationManager.delegate = (id)self;
self->locationManager startUpdatingLocation];
}