为什么我的按钮没有从应用程序推送到Apple Maps?

时间:2018-10-15 21:47:41

标签: ios swift xcode button mapkit

我有一个正在使用的导航应用程序,其工作方式与普通地图应用程序类似,允许您通过搜索表等搜索位置。在该应用程序中,用户可以通过从我的可搜索对象中单击所需的结果来创建注释。问题:当用户点击注释时,应该会在其上方显示一个弹出按钮,因为我是通过编程方式创建的。单击后,它应该将用户推送到Apple Maps应用程序,并带有指向他们单击的注解的路径的预先加载。它不再将我推送到那里,这很奇怪,因为它曾经可以工作。这是通过程序创建的按钮:

extension ViewController : MKMapViewDelegate {
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?{
    if annotation is MKUserLocation {
        //return nil so map view draws "blue dot" for standard user location
        return nil
    }
    let reuseId = "pin"
    var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? MKPinAnnotationView
    pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
    pinView?.pinTintColor = UIColor.red
    pinView?.canShowCallout = true
    let smallSquare = CGSize(width: 30, height: 30)
    let button = UIButton(frame: CGRect(origin: (CGPoint()), size: smallSquare))
    button.setBackgroundImage(UIImage(named: "car"), for: [])
    button.addTarget(self, action: #selector(getDirections), for: UIControlEvents.touchUpInside)

    pinView?.leftCalloutAccessoryView = button
    return pinView
}
}

这应该实现(在课堂上)

@objc func getDirections(){
if let selectedPin = selectedPin {
    let mapItem = MKMapItem(placemark: selectedPin)
    let launchOptions = [MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving]
    mapItem.openInMaps(launchOptions: launchOptions)
}
}

使用目标C函数会有点奇怪吗?这是我最近添加的代码,虽然我真的不知道,但可能会导致此问题:

func resolveAddress(for averageCoordinate: CLLocationCoordinate2D, completion: @escaping (MKPlacemark?) -> () ) {

    let geocoder = CLGeocoder()
    let averageLocation = CLLocation(latitude: averageCoordinate.latitude, longitude: averageCoordinate.longitude)
    geocoder.reverseGeocodeLocation(averageLocation) { (placemarks, error) in
        guard error == nil,
            let placemark = placemarks?.first
        else {
            completion(nil)
            return
        }
        completion(MKPlacemark(placemark: placemark ))
    }
}

@IBAction func middleFinderButton(_ sender: Any) {

    let totalLatitude = mapView.annotations.reduce(0) { $0 + $1.coordinate.latitude }

    let totalLongitude = mapView.annotations.reduce(0) { $0 + $1.coordinate.longitude }

    let averageLatitude = totalLatitude/Double(mapView.annotations.count)

    let averageLongitude = totalLongitude/Double(mapView.annotations.count)

    let centerPoint = MKPointAnnotation()

    centerPoint.coordinate.latitude = averageLatitude
    centerPoint.coordinate.longitude = averageLongitude


    mapView.addAnnotation(centerPoint)

    resolveAddress(for: centerPoint.coordinate) { placemark in
        if let placemark = placemark {
            self.mapView.addAnnotation(placemark)
        } else {
            self.mapView.addAnnotation(centerPoint)
        }
    }

    print(totalLatitude)
    print(totalLongitude)
    print(averageLatitude)
    print(averageLongitude)
    print(centerPoint.coordinate)

    }

github链接:github.com/derekvandermark/VHNavigationAppOfficial-v-0.93

任何人都知道为什么此按钮不起作用,并将应用程序推送到具有预设路线的地图吗?模拟器可能会出现故障(它曾经可以工作,所以我对此表示怀疑)?谢谢。

1 个答案:

答案 0 :(得分:0)

要将用户推送到地图应用,您可以尝试以下操作:

func openMap(lat: String, lng: String){

    let lat1 : NSString = lat as NSString
    let lng1 : NSString = lng as NSString

    let latitude:CLLocationDegrees =  lat1.doubleValue
    let longitude:CLLocationDegrees =  lng1.doubleValue

    let regionDistance:CLLocationDistance = 10000
    let coordinates = CLLocationCoordinate2DMake(latitude, longitude)
    let regionSpan = MKCoordinateRegion(center: coordinates, latitudinalMeters: regionDistance, longitudinalMeters: 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.openInMaps(launchOptions: options)
}