6

我发现运行一些代码以在地图视图中显示位置MKMapItem.openInMaps()仅在 50% 的时间内有效。
事实上,它精确地在MKPlacemark显示和不显示之间交替。

例如,每第 1、3、5、7...n 次代码运行,就会显示位置标记,但每运行 2、4、6、8...m 次,则不会显示位置标记。

运行下面发布的代码,这是 100% 可重现的。
这似乎是一个错误,但如果是这样,我很惊讶它之前没有被报告或修复。但考虑到失败正是在成功和失败之间交替出现,这让我认为还有其他事情发生,因此我在这里发帖看看是否有人熟悉这个问题,或者有什么应该做的事情缺失了从代码中,或者有一个解决方法:

override func viewDidAppear(_ animated: Bool) {
    displayMap()
}

func displayMap()
{
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString("1 Infinite Loop, Cupertino,California") { (placemark: [CLPlacemark]?, error: Error?) -> Void in
        if error == nil
        {
            if let placemark = placemark, placemark.count > 0
            {
                let location            = placemark.first
                let latitude            = (location?.location?.coordinate.latitude)!
                let longitude           = (location?.location?.coordinate.longitude)!
                let coordinates         = CLLocationCoordinate2DMake(latitude, longitude)

                let regionDistance:CLLocationDistance = 100000
                let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)

                let options = [
                    MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center),
                    MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span)
                ]
                let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
                let mapItem = MKMapItem(placemark: placemark)

                mapItem.name = "Apple"
                mapItem.phoneNumber = "(405) 123-4567"
                mapItem.openInMaps(launchOptions: options)
            }
        }
        else
        {
            assert(false, "Unable to geocode")
        }
    }
}

这是第一次、第三次、第五次、第七次运行代码时的结果

奇怪的

这是代码运行第二次、第四次、第六次、第八次……时的结果

甚至

请注意,在失败的屏幕截图中,不仅地标没有显示在地图上,而且向上滑动也是空的。

(目前在 10.2 上观察到这一点,但在其他版本上也看到过)

4

2 回答 2

2

免责声明

是的,似乎有一个错误mapItem.openInMaps,它将行车路线作为覆盖打开。

正如@return0准确描述的那样:

...我尝试了您的代码,问题在于,一旦您将位置居中并显示,如果您不关闭它并再次启动应用程序,它将不会显示...

更多奇事

  1. 第二次,mapItem.openInMaps 确实消除了行车路线叠加层(而不是显示新位置)
  2. 如果用户关闭所述叠加层,则地图不再混乱(*)

(*)这种情况的另一个奇怪之处在于,一旦该覆盖关闭,该位置就会消失。

漏洞?→ 解决方法!

通过请求多个位置来强制路线覆盖消失。在实践中,这意味着调用两次相同位置的地图:

MKMapItem.openMaps(with: [mapItem, mapItem], launchOptions: options)

没有方向,但没有卡住 方向但不卡住

变通办法奖金

即使用户点击锚点并请求行驶方向,从您的应用程序到该位置或其他位置对地图的后续调用也不会让它挂起。换句话说,它按预期工作。


完整的 Swift 3 源代码

func displayMap(_ address:String, name:String, tph:String)
{
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString(address) { (placemark: [CLPlacemark]?, error: Error?) -> Void in
        assert(nil == error,  "Unable to geocode \(error)")
        if error == nil
        {
            if let placemark = placemark, placemark.count > 0
            {
                let location            = placemark.first
                let latitude            = (location?.location?.coordinate.latitude)!
                let longitude           = (location?.location?.coordinate.longitude)!
                let coordinates         = CLLocationCoordinate2DMake(latitude, longitude)

                let regionDistance:CLLocationDistance = 10000
                let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)

                let options = [
                    MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center),
                    MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span)
                ]
                let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
                let mapItem = MKMapItem(placemark: placemark)

                mapItem.name = name
                mapItem.phoneNumber = tph
                MKMapItem.openMaps(with: [mapItem, mapItem], launchOptions: options)
            } else {
                print("Something wrong with \(placemark)")
            }
        }
    }
}

...和调用

@IBAction func doApple() {
    displayMap("1 Infinite Loop, Cupertino, California", name: "Apple", tph: "(408) 996–1010")
}

@IBAction func doMicrosoft() {
    displayMap("One Microsoft Way, Redmond, WA", name: "Microsoft", tph: "1-800-MICROSOFT")
}

@IBAction func doIBM() {
    displayMap("1 New Orchard Road. Armonk, New York", name: "IBM", tph: "(914) 499-1900")
}
于 2017-01-06T07:45:41.813 回答
0

在 iOS 10.3.2 上,这个问题对我来说仍然存在。但是,此解决方法mapItem不会消失:

MKMapItem.openMaps(with: [mapItem], launchOptions: options)
于 2017-07-08T08:50:00.980 回答