0

В следующем коде мне нужно установить каждый конкретный маркер в функцию. Как установить функцию: Когда MarkerInfoWindow используется, а затем открыть URL-адрес? URL-адрес должен быть конкретным для каждого маркера.Swift: Как установить функции для каждого конкретного маркера?

Идея - это когда MarkerInfoWindow используется для маркера1, тогда он должен отображать навигацию для этого маркера1.

Вопрос как я перепишем этот код, чтобы функция специфична для каждого маркера

Маркер 1:

let marker1 = GMSMarker() 
marker1.position = CLLocationCoordinate2D(latitude: 55.6726299, longitude: 12.5662175) 
marker1.title = "Københavns Hovedbanegård" 
marker1.snippet = "Press for navigation" 
marker1.tracksViewChanges = true 
marker1.opacity = 0.9 
marker1.icon = UIImage(named: "BCmarker") 
marker1.appearAnimation = kGMSMarkerAnimationNone 
marker1.map = self.googleMapsView 

Маркер 2:

let marker2 = GMSMarker() 
marker2.position = CLLocationCoordinate2D(latitude: 55.68, longitude: 12.55) 
marker2.title = "Test Marker2" 
marker2.snippet = "Press for navigation" 
marker2.tracksViewChanges = true 
marker2.opacity = 0.9 
marker2.icon = UIImage(named: "BCmarker") 
marker2.appearAnimation = kGMSMarkerAnimationNone 
marker2.map = self.googleMapsView 

функций, которые каждый конкретный маркер назначается:

func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) { 
let testURL = URL(string: "comgooglemaps-x-callback://")! 
if UIApplication.shared.canOpenURL(testURL) { 
    let directionsRequest = "comgooglemaps-x-callback://" + 
    "?daddr=55.6726299,12.5662175&directionsmode=walking&zoom=17" 

    let directionsURL = URL(string: directionsRequest)! 
    UIApplication.shared.openURL(directionsURL) 
} else { 
    UIApplication.shared.openURL(NSURL(string: "http://maps.apple.com/?address=1600,PennsylvaniaAve.,20500")! as URL) 
} 

Спасибо!

После ответа от @Sweeper, это то, как выглядит код: импорт UIKit импорта GoogleMaps импорт GooglePlaces

class ViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate, GMSAutocompleteViewControllerDelegate { 

// OUTLETS! 
@IBOutlet weak var googleMapsView: GMSMapView! 

// VARIABLES! 
var locationManager = CLLocationManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // GET LOCATION WHILE USING APP 
    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 
    locationManager.startMonitoringSignificantLocationChanges() 

    initGoogleMaps() 
} 


    // START GOOGLE MAPS! 
func initGoogleMaps() { 

    let zoomCamera = GMSCameraUpdate.zoomIn() 
    googleMapsView.animate(with: zoomCamera) 

    // Create a GMSCameraPosition that tells the map to display the 
    // coordinate -33.86,151.20 at zoom level 6. 
    let camera = GMSCameraPosition.camera(withLatitude: 55.6760968, longitude: 12.568337100000008, zoom: 12.5) 
    _ = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 
    self.googleMapsView.camera = camera 

    // CREATE FIND LOCATION BUTTON?? 
    self.googleMapsView.delegate = self 
    self.googleMapsView.isMyLocationEnabled = true 
    self.googleMapsView.settings.myLocationButton = true 

    // MARKERS 
    let marker1 = GMSMarker() 
    marker1.position = CLLocationCoordinate2D(latitude: 55.6726299, longitude: 12.5662175) 
    marker1.title = "Københavns Hovedbanegård" 
    marker1.snippet = "Tryk for at få navigation" 
    marker1.tracksViewChanges = true 
    marker1.opacity = 0.9 
    marker1.icon = UIImage(named: "BCmarker") 
    marker1.appearAnimation = kGMSMarkerAnimationNone 
    marker1.map = self.googleMapsView 

    let marker2 = GMSMarker() 
    marker2.position = CLLocationCoordinate2D(latitude: 55.68, longitude: 12.55) 
    marker2.title = "Test Marker2" 
    marker2.snippet = "Tryk for at få navigation" 
    marker2.tracksViewChanges = true 
    marker2.opacity = 0.9 
    marker2.icon = UIImage(named: "BCmarker") 
    marker2.appearAnimation = kGMSMarkerAnimationNone 
    marker2.map = self.googleMapsView 

    let markerFunctions: [GMSMarker: (() -> Void)] = [ 
     marker1: { print("Test1") }, 
      marker2: { print("Test2") } 
    ] 

} 

// ...something else about Google Places 

ответ

0

mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) будет вызываться, когда информационного окна любого маркеров сливают. Вы хотите получить конкретную информацию, которая будет вызываться только тогда, когда отображается информационное окно маркера определенного. Надеюсь, я правильно понял ваш вопрос.

К сожалению, в Google Maps API такого метода делегирования нет.

Ну, простой обходной путь будет просто использовать, если заявление, чтобы проверить, является ли оно marker1 или marker2:

func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) { 
    if marker == marker1 { // remember to declare marker 1 and 2 at class level! 
     // do stuff 
    } else if marker == marker2 { 
     // do other stuff 
    } 
} 

В качестве альтернативы, вы можете поместить материал, который Вы хотите каждый маркер, чтобы сделать в словаре:

let markerFuntions: [GMSMarker: (() -> Void)] = [ 
    marker1: { // do stuff } 
    marker2: { // do other stuff } 
] 

Вы можете просто написать метод делегата, как это:

func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) { 
    markerFunctions[marker]?() 
} 

EDIT: Я пытался исправить проблемы с вашим кодом, вот что я получил:

class ViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate, GMSAutocompleteViewControllerDelegate { 

// OUTLETS! 
@IBOutlet weak var googleMapsView: GMSMapView! 

// VARIABLES! 
var locationManager = CLLocationManager() 
var marker1: GMSMarker! 
var marker2: GMSMarker! 
var markerFunctions: [GMSMarker: (() -> Void)]! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // GET LOCATION WHILE USING APP 
    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 
    locationManager.startMonitoringSignificantLocationChanges() 

    initGoogleMaps() 
} 


    // START GOOGLE MAPS! 
func initGoogleMaps() { 

    let zoomCamera = GMSCameraUpdate.zoomIn() 
    googleMapsView.animate(with: zoomCamera) 

    // Create a GMSCameraPosition that tells the map to display the 
    // coordinate -33.86,151.20 at zoom level 6. 
    let camera = GMSCameraPosition.camera(withLatitude: 55.6760968, longitude: 12.568337100000008, zoom: 12.5) 
    _ = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 
    self.googleMapsView.camera = camera 

    // CREATE FIND LOCATION BUTTON?? 
    self.googleMapsView.delegate = self 
    self.googleMapsView.isMyLocationEnabled = true 
    self.googleMapsView.settings.myLocationButton = true 

    // MARKERS 
    marker1 = GMSMarker() 
    marker1.position = CLLocationCoordinate2D(latitude: 55.6726299, longitude: 12.5662175) 
    marker1.title = "Københavns Hovedbanegård" 
    marker1.snippet = "Tryk for at få navigation" 
    marker1.tracksViewChanges = true 
    marker1.opacity = 0.9 
    marker1.icon = UIImage(named: "BCmarker") 
    marker1.appearAnimation = kGMSMarkerAnimationNone 
    marker1.map = self.googleMapsView 

    marker2 = GMSMarker() 
    marker2.position = CLLocationCoordinate2D(latitude: 55.68, longitude: 12.55) 
    marker2.title = "Test Marker2" 
    marker2.snippet = "Tryk for at få navigation" 
    marker2.tracksViewChanges = true 
    marker2.opacity = 0.9 
    marker2.icon = UIImage(named: "BCmarker") 
    marker2.appearAnimation = kGMSMarkerAnimationNone 
    marker2.map = self.googleMapsView 

    markerFunctions = [ 
     marker1: { print("Test1") }, 
     marker2: { print("Test2") } 
    ] 

} 

func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) { 
    markerFunctions[marker]?() 
} 

// ...something else about Google Places 
+0

Привет @Sweeper Я добавил «пусть markerFunctions ....» ниже маркера и добавил функцию в «Файл AppDelegate», но ошибка: «Используется неразрешенный идентификатор« markerFuntions »... появляется. Что я могу сделать, чтобы этого избежать? (Все цели указаны в «Целевом членстве».) –

+0

@ ChristofferSkov Почему бы не объявить отдельные функции в том же классе, что и делегат отображения карты? Вы можете отредактировать вопрос, чтобы добавить соответствующий код? – Sweeper

+0

Я отредактировал этот вопрос, чтобы вы могли видеть полный текст. Обратите внимание, что функция все еще находится в файле «AppDelegate». Здесь код выглядит следующим образом: func mapView (_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) { markerФункции [marker]?() } –