Доступ к параметру структуры из карты аннотаций в xcode - PullRequest
0 голосов
/ 06 ноября 2019

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

После некоторого урока мне удалось создать функциональное приложение с пин-кодом и кнопкой, но мне не удалось открыть URL.

Этот код я использую для создания приложения:

struct WebCam {
  var name: String
  var latitude: CLLocationDegrees
  var longitude: CLLocationDegrees
  var url: String
}

class FirstViewController: UIViewController, CLLocationManagerDelegate {

@IBOutlet weak var mapView: MKMapView!

let webcams = [WebCam(name: "WH1", latitude: 51.5549, longitude: -0.108436, url: "www.test.it"),
                WebCam(name: "WH2", latitude: 51.4816, longitude: -0.191034, url: "www.google.it")]

func fetchWebcamsOnMap(_ webcams: [WebCam]) {
  for webcam in webcams {
    let annotations = MKPointAnnotation()
    annotations.title = webcam.name
    annotations.coordinate = CLLocationCoordinate2D(latitude: webcam.latitude, longitude: webcam.longitude)
    mapView.addAnnotation(annotations)
  }
}

extension FirstViewController: MKMapViewDelegate {

func mapView(_ mapView: MKMapView, viewFor annotations: MKAnnotation) -> 
MKAnnotationView? {
let identifier = "WebCam"
var view: MKMarkerAnnotationView
// 4
if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
  as? MKMarkerAnnotationView {
  dequeuedView.annotation = annotations
  view = dequeuedView
} else {
  // 5
  view = MKMarkerAnnotationView(annotation: annotations, reuseIdentifier: identifier)
  view.canShowCallout = true
  view.calloutOffset = CGPoint(x: -5, y: 5)
    let mapsButton = UIButton(frame: CGRect(origin: CGPoint.zero,
       size: CGSize(width: 30, height: 30)))
    mapsButton.setBackgroundImage(UIImage(named: "webcam"), for: UIControl.State())
    view.rightCalloutAccessoryView = mapsButton
}

return view

}

И это код для извлечения кнопки UIButton

    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
       if control == view.rightCalloutAccessoryView {

       }
   }

Я попытался распечатать простую консоль с URL-адресом выбранной веб-камеры, обратившись к ней с помощью

let web = view.annotation as! WebCam
let webURL = WebCam.url

но это показывает ошибку.

Ответы [ 3 ]

1 голос
/ 06 ноября 2019

WebCam должен быть под классом из MKPointAnnotation

class WebCam : MKPointAnnotation {
    var url : String

    init(name : String, latitude : CLLocationDegrees, longitude : CLLocationDegrees, url : String) {
        self.url = url
        super.init()
        self.title = name
        self.coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
    }
}

Тогда вы можете создавать экземпляры

let webcams = [WebCam(name: "WH1", latitude: 51.5549, longitude: -0.108436, url: "www.test.it"),
               WebCam(name: "WH2", latitude: 51.4816, longitude: -0.191034, url: "www.google.it")]

fetchWebcamsOnMapуменьшено до

func fetchWebcamsOnMap(_ webcams: [WebCam]) {
    mapView.addAnnotations(webcams)
}

и

let web = view.annotation as! WebCam
let webURL = web.url

будет работать.

1 голос
/ 06 ноября 2019

Это приведение завершится сбоем

let web = view.annotation as! WebCam

Вам необходимо создать подкласс

class CusAnn:MKPointAnnotation {
  var url:String?
}

и добавить аннотации, такие как

let annotations = CusAnn()

Затем

let web = view.annotation as! CusAnn
let webURL = web.url
0 голосов
/ 06 ноября 2019

Также в вашем коде изображена проблема с вашим кодом в следующих строках

let web = view.annotation as! WebCam

заменить

let webURL = WebCam.url

на

let webURL = web.url
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...