Добавьте свойство в свой пользовательский класс аннотаций (тот, который реализует 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;