Открывайте разные веб-сайты с помощью точек на карте - PullRequest
0 голосов
/ 29 декабря 2011

Моя идея состоит в том, чтобы иметь несколько (может быть, до 100) точек на карте Google.

Я создал кнопку в аннотации, которая появляется, когда я нажимаю на булавку. Я хочу, чтобы каждая точка была подключена к веб-сайту. Различный веб-сайт для каждой точки.

Но сейчас я использую это:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
    calloutAccessoryControlTapped:(UIControl *)control
{
    [[UIApplication sharedApplication] 
        openURL:[NSURL URLWithString: @"http://www.google.co.uk"]];

Проблема в том, что с этим кодом все точки открываются на одном сайте.

Можно ли как-то указать веб-адрес для каждой точки?

#import "ViewController.h"
#import "NewClass.h"

@implementation ViewController
@synthesize mapview;

NSString *myString;

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    //[[UIApplication sharedApplication] 
     //openURL:[NSURL URLWithString: @"http://www.arebikepark.se"]];

   NewClass *ann = (NewClass *)view.annotation;
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:ann.website]];
}

-(IBAction)getLocation {
    mapview.showsUserLocation = YES;
}

-(IBAction)setMap:(id)sender {
    switch (((UISegmentedControl *) sender).selectedSegmentIndex) {
        case 0:
            mapview.mapType = MKMapTypeStandard;
            break;
        case 1:
            mapview.mapType = MKMapTypeSatellite;
            break;
        case 2:
            mapview.mapType = MKMapTypeHybrid;
            break;

        default:
            break;
 }
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [mapview setMapType:MKMapTypeStandard];
    [mapview setZoomEnabled:YES];
    [mapview setScrollEnabled:YES];

    MKCoordinateRegion region = { {0.0, 0.0 }, {0.0, 0.0 } };
    region.center.latitude = 63.399785761795506;
    region.center.longitude =  12.91691780090332;
    region.span.longitudeDelta = 100.0f;
    region.span.latitudeDelta = 100.0f;
    [mapview setRegion:region animated:YES];

    NewClass *ann = [[NewClass alloc] init];
    ann.title = @"Åre";
    ann.subtitle = @"www.arebikepark.se";
    ann.coordinate = region.center;
    ann.website = @"arebikepark.se";
    [mapview addAnnotation:ann];

    MKCoordinateRegion region1 = { {0.0, 0.0 }, {0.0, 0.0 } };
    region1.center.latitude = 61.717050948488904;
    region1.center.longitude =  16.153764724731445;
    region1.span.longitudeDelta = 100.0f;
    region1.span.latitudeDelta = 100.0f;
    [mapview setRegion:region1 animated:YES];

    NewClass *ann1 = [[NewClass alloc] init];
    ann1.title = @"Järvsö";
    ann1.subtitle = @"www.jarvsobergscykelpark.se";
    ann1.coordinate = region1.center;
    ann.website = @"www.jarvsobergscykelpark.se";
    [mapview addAnnotation:ann1];

    MKCoordinateRegion region2 = { {0.0, 0.0 }, {0.0, 0.0 } };
    region2.center.latitude = 57.84191869696362;
    region2.center.longitude =  12.02951431274414;
    region2.span.longitudeDelta = 100.0f;
    region2.span.latitudeDelta = 100.0f;
    [mapview setRegion:region2 animated:YES];

    NewClass *ann2 = [[NewClass alloc] init];
    ann2.title = @"Ale";
    ann2.subtitle = @"www.alebikepark.se";
    ann2.coordinate = region2.center;
    [mapview addAnnotation:ann2];

    MKCoordinateRegion region3 = { {0.0, 0.0 }, {0.0, 0.0 } };
    region3.center.latitude = 61.17768100166834;
    region3.center.longitude =  13.261871337890625;
    region3.span.longitudeDelta = 100.0f;
    region3.span.latitudeDelta = 100.0f;
    [mapview setRegion:region3 animated:YES];

    NewClass *ann3 = [[NewClass alloc] init];
    ann3.title = @"Kläppen";
    ann3.subtitle = @"www.klappen.se/sv/Sommar/Bikepark";
    ann3.coordinate = region3.center;
    ann3.website = @"www.klappen.se/sv/Sommar/Bikepark";
    [mapview addAnnotation:ann3];

    MKCoordinateRegion region4 = { {0.0, 0.0 }, {0.0, 0.0 } };
    region4.center.latitude = 65.82881853569008;
    region4.center.longitude =  15.067813396453857;
    region4.span.longitudeDelta = 100.0f;
    region4.span.latitudeDelta = 100.0f;
    [mapview setRegion:region4 animated:YES];

    NewClass *ann4 = [[NewClass alloc] init];
    ann4.title = @"Hemavan";
    ann4.subtitle = @"www.bikepark.nu";
    ann4.coordinate = region4.center;
    ann4.website = @"www.bikepark.nu";
    [mapview addAnnotation:ann4];

    MKCoordinateRegion region5 = { {0.0, 0.0 }, {0.0, 0.0 } };
    region5.center.latitude = 63.29058608431198;
    region5.center.longitude =  18.7042236328125;
    region5.span.longitudeDelta = 100.0f;
    region5.span.latitudeDelta = 100.0f;
    [mapview setRegion:region5 animated:YES];

    NewClass *ann5 = [[NewClass alloc] init];
    ann5.title = @"Örnsköldsvik";
    ann5.subtitle = @"www.hkbikepark.se";
    ann5.coordinate = region5.center;
    ann5.website = @"www.hkbikepark.se";
    [mapview addAnnotation:ann5];
}

-(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    MKPinAnnotationView *MyPin =(MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"MyPin"];
    if (!MyPin) {
        MyPin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"MyPin"];
        MyPin.pinColor = MKPinAnnotationColorRed;
        MyPin.canShowCallout = YES;
        UIButton *details = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        MyPin.rightCalloutAccessoryView = details;
        MyPin.canShowCallout = YES;
    }
    return MyPin;
}

@end

1 Ответ

0 голосов
/ 29 декабря 2011

Добавьте свойство в свой пользовательский класс аннотаций (тот, который реализует MKAnnotation), в котором хранится веб-сайт аннотации.Установите это свойство при добавлении аннотации на карту:

ann.website = @"http://www.google.co.uk";
[mapView addAnnotation:ann];

Затем в методе делегата calloutAccessoryControlTapped вы можете получить доступ к этому свойству:

MyAnnotationClass *ann = (MyAnnotationClass *)view.annotation;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:ann.website]];


На основеВ добавленном вами дополнительном коде проблема заключается в том, что строки URL сайта не имеют префикса схемы http://, который необходим методу URLWithString для преобразования строки в URL.Поскольку строки URL недопустимы, метод возвращает nil, в результате чего метод openURL ничего не делает.

Так, например, строки, которые устанавливают свойство website, должны быть:

ann.website = @"http://www.arebikepark.se";
ann1.website = @"http://www.jarvsobergscykelpark.se";
ann2.website = @"http://www.alebikepark.se";  //(line was missing completely)
ann3.website = @"http://www.klappen.se/sv/Sommar/Bikepark";
ann4.website = @"http://www.bikepark.nu";
ann5.website = @"http://www.hkbikepark.se";

Кроме того, хотя приведенные выше URL-адреса не являются проблемой, если вы намереваетесь использовать URL-адреса со строками запроса, которые могут содержать специальные символы, вам также потребуется экранировать строку URL-адреса перед ее передачей.Одним из способов является использование метода stringByAddingPercentEscapesUsingEncoding.См. этот ответ Дейва Делонга для примера и некоторые меры предосторожности / ограничения / альтернативы для этого метода.

Наконец, не связанные с вашей основной проблемой, но вот некоторые дополнительные комментарии к коду:

  • Вам не нужно создавать регион для каждой аннотации, просто чтобы установить его координату.Вы можете просто сделать ann.coordinate = CLLocationCoordinate2DMake(63.399785761795506, 12.91691780090332);
  • Если вы не используете ARC, есть несколько утечек памяти.
  • В viewForAnnotation, вы должны добавить else деталь к ifоператор: else MyPin.annotation = annotation; в случае, если представление аннотации повторно используется для другой аннотации.Вероятно, этого не произойдет с таким небольшим количеством аннотаций, но это логически и технически необходимо.
  • Если вы хотите, чтобы местоположение пользователя отображалось в виде синей точки вместо красной булавки, вам нужно добавить это квершина viewForAnnotation метода: if ([annotation isKindOfClass:[MKUserLocation class]]) return nil;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...