在地图 Swift 上选择注释时坐标为零

Posted

技术标签:

【中文标题】在地图 Swift 上选择注释时坐标为零【英文标题】:Coordinates are nil when selecting annotation on map Swift 【发布时间】:2019-11-19 12:42:23 【问题描述】:

我正在更改我的应用程序的一部分,从在 UITableview 中显示一些商店以在 MKMapView 上显示它们并且它们显示得很好,但是当我在地图上选择注释时,我得到的坐标值为零。在didAdd 我打印它们并且它们很好,实际上注释显示在地图上。 自从我上次使用 MapKit 以来已经有一段时间了,我无法发现问题是在自定义注释类中还是在其他地方。你能发现我在哪里滥用它吗? 一如既往,非常感谢您的时间和帮助。 这是注解类:

class ShopAnnotation: NSObject , MKAnnotation 

    var title: String?
    var coordinate:CLLocationCoordinate2D
    var image: UIImage?
    var shopName: String?
    var shopLogoUrl: String?

    init(title: String, iconImage: UIImage, coordinate:CLLocationCoordinate2D, shopName: String, shopLogoUrl: String) 


        self.coordinate = coordinate
        self.title = title
        self.shopName = shopName
        self.shopLogoUrl = shopLogoUrl
        self.image = iconImage

    

我有一个数组,我从中获取值:

var availableShopsArray:[(name:String, logoUrl:String, homeLat: String, homeLong: String)] = []

然后循环遍历它并在地图上放置注释:

func displayShops() 
        mapView.removeAnnotations(mapView.annotations)

        for shop in availableShopsArray 
            let coordinates: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: Double(shop.homeLat)!, longitude: Double(shop.homeLong)!)
            let title = "Route Mid"
            let image = UIImage(named: title)!
            let shopAnn: ShopAnnotation = ShopAnnotation(title: title, iconImage: image, coordinate: coordinates, shopName: shop.name, shopLogoUrl: shop.logoUrl)
            mapView.addAnnotation(shopAnn)
        
//        self.availableShopsTableview.reloadData()
    

当我选择一个时,我应该从中取值,但坐标为零:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) 
        guard let selectedShop = view.annotation as? ShopAnnotation else return
        self.shopLogoUrl = selectedShop.shopLogoUrl!
        self.selectedShopCoordinates.latitude = selectedShop.coordinate.latitude
        self.selectedShopCoordinates.longitude = selectedShop.coordinate.longitude
        self.selectedShopName = selectedShop.shopName

//        calculateBookingType()
        self.performSegue(withIdentifier: "bookingToCartSegue", sender: self)
    

这是viewForAnnotation

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?  // rajish version
        let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "")

        if annotation is MKUserLocation
            return nil
         else 
            print("Annotation.coordinates are: \(String(describing: annotation.coordinate))")
//            print("annotation title is: \(String(describing: annotation.title!))")
            annotationView.image = UIImage(named:(annotationView.annotation?.title)! ?? "")

            annotationView.canShowCallout = true
            let transform = CGAffineTransform(scaleX: 0.27, y: 0.27) // alert annotation's icons size
            annotationView.transform = transform
            // makin allerts draggable
            annotationView.isDraggable = false
            return annotationView
        
    

【问题讨论】:

确保它最初不是来自您的模型的 nil 我在 displaySops() 中添加了 print("displayShops() 坐标是:(coordinates)") ,它可以很好地打印它们。他们会在哪里迷路? 【参考方案1】:

奇怪的是,我将纬度和经度从selectedShop.coordinate 分别分配给selectedShopCoordinates,然后它会找到零。 我现在将它们分配为selectedShopCoordinates = selectedShop.coordinate 的坐标,并且不再崩溃。

为什么它会在单个坐标度数上找到 nil 仍然是一个谜。 任何关于为什么的想法将不胜感激。 希望这将帮助其他人挣扎。 干杯

【讨论】:

以上是关于在地图 Swift 上选择注释时坐标为零的主要内容,如果未能解决你的问题,请参考以下文章

GMSPlace 返回无效坐标(-180、-180),但名称和地点 ID 正确

swift:将注释从一个坐标移动到另一个坐标

将 Firebase 中的坐标表示为注释 Swift

当 bean 类与一对多注释链接时,使用 hibernate 在 db 上选择查询:

在 UITableView 中的 viewdidload 上选择 Cells,基于 String Array (Swift)

当使用 swift 中的搜索栏在 tableview 上选择一行时,它不会执行所需的功能