带有 Swift 的 Mapkit Pin 注释

Mapkit Pin Annotations with Swift

我正在尝试显示带有多个图钉的世界地图。当点击左按钮时,它应该执行一个 phone 调用,每个 pin 与不同的 phone 号码相关联。我四处搜索并提出了以下代码,但它调用了相同的号码。如何为每个引脚注释分配特定的 phone 编号?

import UIKit
import MapKit
import CoreLocation



class CrewDesksViewController: UIViewController, MKMapViewDelegate {

    @IBOutlet weak var mapView: MKMapView!

    @IBOutlet weak var callCrew: UISegmentedControl!


  let locationManager = CLLocationManager()


    override func viewDidLoad() {
        super.viewDidLoad()



        // Ask for Authorisation from the User.
        self.locationManager.requestAlwaysAuthorization()

        // For use in foreground
        self.locationManager.requestWhenInUseAuthorization()

        if CLLocationManager.locationServicesEnabled() {
//            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            locationManager.startUpdatingLocation()

        }
        //Setup our Map View



        self.mapView.delegate = self


        mapView.showsUserLocation = true


    // pin location of different phone numbers for contacting the crewdesk 
        var location : CLLocationCoordinate2D = CLLocationCoordinate2DMake(50.1166667, 8.6833333)
        let pinAnnotation = PinAnnotation()
        pinAnnotation.setCoordinate(location)
        pinAnnotation.title = "Frankfurt"
        pinAnnotation.subtitle = "+496969804620"
        self.mapView.addAnnotation(pinAnnotation)

        var location2 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(41.8781136, -87.6297982)
        let pinAnnotation2 = PinAnnotation()
        pinAnnotation2.setCoordinate(location2)
        pinAnnotation2.title = "USA"
        pinAnnotation2.subtitle = "+1800FLTLINE"
        self.mapView.addAnnotation(pinAnnotation2)

        var location3 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(48.866667, 2.333333)
        let pinAnnotation3 = PinAnnotation()
        pinAnnotation3.setCoordinate(location3)
        pinAnnotation3.title = "Paris"
        pinAnnotation3.subtitle = "+33800900814"
        self.mapView.addAnnotation(pinAnnotation3)

        var location4 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(51.5085300, -0.1257400)
        let pinAnnotation4 = PinAnnotation()
        pinAnnotation4.setCoordinate(location4)
        pinAnnotation4.title = "London"
        pinAnnotation4.subtitle = "+44800896516"
        self.mapView.addAnnotation(pinAnnotation4)

        var location5 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(50.833333, 4.333333)
        let pinAnnotation5 = PinAnnotation()
        pinAnnotation5.setCoordinate(location5)
        pinAnnotation5.title = "Brussels"
        pinAnnotation5.subtitle = "+3980019326"
        self.mapView.addAnnotation(pinAnnotation5)


        var location6 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(35.685, 139.7513889)
        let pinAnnotation6 = PinAnnotation()
        pinAnnotation6.setCoordinate(location6)
        pinAnnotation6.title = "Japan 日本"
        pinAnnotation6.subtitle = "0-0531-12-4066"
        self.mapView.addAnnotation(pinAnnotation6)

        var location7 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(22.2855200, 114.1576900)
        let pinAnnotation7 = PinAnnotation()
        pinAnnotation7.setCoordinate(location7)
        pinAnnotation7.title = "HongKong"
        pinAnnotation7.subtitle = "800-96-5483"
        self.mapView.addAnnotation(pinAnnotation7)


        var location8 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(52.3740300, 4.8896900)
        let pinAnnotation8 = PinAnnotation()
        pinAnnotation8.setCoordinate(location8)
        pinAnnotation8.title = "Amsterdam"
        pinAnnotation8.subtitle = "0-800-022-9324"
        self.mapView.addAnnotation(pinAnnotation8)


        var location9 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(13.75, 100.516667)
        let pinAnnotation9 = PinAnnotation()
        pinAnnotation9.setCoordinate(location9)
        pinAnnotation9.title = "Bangkok"
        pinAnnotation9.subtitle = "01-800-12-066-6078"
        self.mapView.addAnnotation(pinAnnotation9)

        var location10 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(29.3375, 47.6581)
        let pinAnnotation10 = PinAnnotation()
        pinAnnotation10.setCoordinate(location10)
        pinAnnotation10.title = "Kuwait"
        pinAnnotation10.subtitle = "00-1-847-700-9893"
        self.mapView.addAnnotation(pinAnnotation10)

        var location11 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(1.3667, 103.8)
        let pinAnnotation11 = PinAnnotation()
        pinAnnotation11.setCoordinate(location11)
        pinAnnotation11.title = "Singapore"
        pinAnnotation11.subtitle = "800-1204657"
        self.mapView.addAnnotation(pinAnnotation11)

        var location12 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(-33.8830555556, 151.216666667)
        let pinAnnotation12 = PinAnnotation()
        pinAnnotation12.setCoordinate(location12)
        pinAnnotation12.title = "Sydney"
        pinAnnotation12.subtitle = "1-800-1-48557"
        self.mapView.addAnnotation(pinAnnotation12)


        var location13 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(25.0391667, 121.525)
        let pinAnnotation13 = PinAnnotation()
        pinAnnotation13.setCoordinate(location13)
        pinAnnotation13.title = "Taipei"
        pinAnnotation13.subtitle = "0-0801-13-8533"
        self.mapView.addAnnotation(pinAnnotation13)


    }

    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
        if annotation is PinAnnotation {
            let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")

            pinAnnotationView.pinColor = .Purple
            pinAnnotationView.draggable = true
            pinAnnotationView.canShowCallout = true
            pinAnnotationView.animatesDrop = true

            let deleteButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
            deleteButton.frame.size.width = 44
            deleteButton.frame.size.height = 44

            deleteButton.setImage(UIImage(named: "appiconround"), forState: .Normal)

            pinAnnotationView.leftCalloutAccessoryView = deleteButton

            return pinAnnotationView
        }

        return nil
    }

    func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, calloutAccessoryControlTapped control: UIControl!) {

        if let location = view.annotation as? PinAnnotation {

            UIApplication.sharedApplication().openURL(NSURL(string: "tel://+1800FLTLINE")!)


        }

    }

您正在使用 class PinAnnotation,但没有向我们提供 class 的定义。

我假设它是一些 object 符合 MKAnnotation 协议的。

您正在将 phone 数字保存在 PinAnnotation object 的副标题 属性 中。

在您的 calloutAccessoryControlTapped 方法中,您获取传递给用户点击的注释视图。

MKAnnotationView class 有一个 属性 注释,其中包含与注释视图关联的注释 object。

您需要从注释视图中获取注释,加载副标题 属性(这是 MKAnnotation 协议的一部分)并将其用作 phone 编号来放置您的 phone 呼叫.

这是引脚注释class。我明白你在说什么,但我对编码还太陌生,无法将你的观察结果转化为代码。

import Foundation
import UIKit
import MapKit

class PinAnnotation : NSObject, MKAnnotation {
    private var coord: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 0, longitude: 0)

    var coordinate: CLLocationCoordinate2D {
        get {
            return coord
        }
    }

    var title: String = ""
    var subtitle: String = ""

    func setCoordinate(newCoordinate: CLLocationCoordinate2D) {
        self.coord = newCoordinate
    }
}