0

我试图在 MapView 上显示两个注释。

为什么 MapView 中不显示第二个注释?我试图将 placemarks[0] 更改为 placemarks[1] 但没有任何帮助。

我本可以使用 for 子句,但为了测试我重复了代码。

class Asiakas {
    var nimi = ""
    var osoite = ""

    init(nimi: String, osoite: String) {
        self.nimi = nimi
        self.osoite = osoite
    }
}


class ViewController: UIViewController {

    @IBOutlet weak var mapView: MKMapView!

    var asiakkaat:[Asiakas] = [
        Asiakas(nimi: "Testi Asiakas", osoite: "Museokatu 10, helsinki"),
        Asiakas(nimi: "Hyvä asiakas", osoite: "Pihlajatie 17, helsinki")
    ]

    var asiakas:Asiakas!


    override func viewDidLoad() {
        super.viewDidLoad()

        let geoCoder = CLGeocoder()

        geoCoder.geocodeAddressString(asiakkaat[0].osoite, completionHandler: { placemarks, error in
            if error != nil {
                print(error)
                return
            }

            if let placemarks = placemarks {
                let placemark = placemarks[0]

                let annotation = MKPointAnnotation()
                if let location = placemark.location {
                    annotation.coordinate = location.coordinate
                    self.mapView.addAnnotation(annotation)
                }
            }
        })

        geoCoder.geocodeAddressString(asiakkaat[1].osoite, completionHandler: { placemarks, error in
            if error != nil {
                print(error)
                return
            }

            if let placemarks = placemarks {
                let placemark = placemarks[0]

                let annotation = MKPointAnnotation()
                if let location = placemark.location {
                    annotation.coordinate = location.coordinate
                    self.mapView.addAnnotation(annotation)
                }
            }
        })

    }
4

1 回答 1

0

您不能同时调用多个地理编码服务。

来自以下文档geocodeAddressString(_ addressString: String, completionHandler: CoreLocation.CLGeocodeCompletionHandler)

使用指定的字符串提交转发地理编码请求。该方法将指定的位置数据异步提交给地理编码服务器并返回。您的完成处理程序块将在主线程上执行。发起正向地理编码请求后,不要尝试发起另一个正向或反向地理编码请求。

因此,您需要在第一个电话完成后拨打第二个电话。

如果你这样做,你会得到正确的结果:

let geoCoder = CLGeocoder()

geoCoder.geocodeAddressString(asiakkaat[0].osoite, completionHandler: { placemarks, error in
    if error != nil {
        print(error)
        return
    }

    geoCoder.geocodeAddressString(self.asiakkaat[1].osoite, completionHandler: { placemarks, error in
        if error != nil {
            print(error)
            return
        }

        if let placemarks = placemarks {
            let placemark = placemarks[0]

            let annotation = MKPointAnnotation()
            if let location = placemark.location {
                annotation.coordinate = location.coordinate
                self.mapView.addAnnotation(annotation)
            }
        }
    })

    if let placemarks = placemarks {
        let placemark = placemarks[0]

        let annotation = MKPointAnnotation()
        if let location = placemark.location {
            annotation.coordinate = location.coordinate
            self.mapView.addAnnotation(annotation)
        }
    }
})
于 2016-11-24T20:36:22.730 回答