2

发生的情况是我在搜索字段中输入地址并单击“开始”。找到位置并放大地图。我单击图钉图像,标题气泡弹出并显示标题。

我创建了一个属性“pin”作为对 title 属性的引用。拖动到新位置完成后,我使用对新位置的引用设置属性标题标签。在 NSLog 中,该属性显示为已更改。但是当我点击拖动到新位置并且拖动结束时,标题属性的相同原始值保持不变。

我看过很多关于类似事情的问题,但没有任何效果。

这是我的 GO 按钮方法:

  @IBAction func didTapGoButton(sender: UIButton) {
        self.spinnerContainer.hidden = false
        var geocoder = CLGeocoder()
        geocoder.geocodeAddressString(searchField.text, {(placemarks: [AnyObject]!, error: NSError!) -> Void in
            if let placemark = placemarks?[0] as? CLPlacemark {


                var region = self.mapView.region as MKCoordinateRegion
                region.center = placemark.location.coordinate
                region.span.longitudeDelta = 0.0144927536
                region.span.latitudeDelta = 0.0144927536

                self.mapView.zoomEnabled = true
                self.mapView.scrollEnabled = true
                let pa = MKPointAnnotation()
                pa.coordinate = placemark.location.coordinate
                pa.title = "\(placemark.name), \(placemark.locality), \(placemark.country)"

                self.spinnerContainer.hidden = true
                self.mapView.addAnnotation(pa)
                self.pin = pa
                self.mapView.setRegion(region, animated: true)
                self.annotationTitle = pa.title
                self.searchField.text = ""

                //self.mapView.selectAnnotation(pa, animated: true)

                var newLocation = CLLocation(latitude: pa.coordinate.latitude, longitude: pa.coordinate.longitude)
                var geocoder = CLGeocoder()
                geocoder.reverseGeocodeLocation(newLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) -> Void in
                    if let placemark = placemarks?[0] as? CLPlacemark {


                      //  let pa = MKPointAnnotation()
                        pa.coordinate = placemark.location.coordinate
                        pa.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

                        NSLog("\(pa.title)")
                        self.addressFromCoordinates.text = pa.title
                        self.noAddressLabel.hidden = true

                    }
                })


            }

        })
    }

我对动画的看法:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

    if annotation.isKindOfClass(MKUserLocation) {
        return nil
    }

    let reuseId = "pin"
    var pin = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)

    if pin == nil {
        NSLog("PIN NIL")
        pin = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pin.image = UIImage(named: "pin")
        pin.draggable = true
        pin.canShowCallout = true

    }
    else
    {
        NSLog("PIN NOT NIL")
        pin.annotation = annotation
    }
    return pin;
}

我的 didChangeDragState 方法:

 func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
        if newState == MKAnnotationViewDragState.Starting
        {
            view.dragState = MKAnnotationViewDragState.Dragging
        }
        else if newState == MKAnnotationViewDragState.Ending || newState == MKAnnotationViewDragState.Canceling
        {
            view.dragState = MKAnnotationViewDragState.None


            var newLocation = CLLocation(latitude: self.pin.coordinate.latitude, longitude: self.pin.coordinate.longitude)

            var geocoder = CLGeocoder()
            geocoder.reverseGeocodeLocation(newLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) -> Void in
                if let placemark = placemarks?[0] as? CLPlacemark {

                    let pa = MKPointAnnotation()
                    pa.coordinate = placemark.location.coordinate
                    pa.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

                    self.annotationTitle = pa.title

                    self.addressFromCoordinates.text = pa.title
                    self.editAddressButton.hidden = false
                    self.noAddressLabel.hidden = true
                }
            })
            NSLog("\(self.pin.coordinate.latitude), \(self.pin.coordinate.longitude)")
        }
    }

拖动后是否需要对地图视图进行某种刷新?

谢谢你的时间

4

1 回答 1

4

didChangeDragState中,这段代码:

let pa = MKPointAnnotation()
pa.coordinate = placemark.location.coordinate
pa.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

self.annotationTitle = pa.title

没有更新title刚刚拖动的注释,因为:

  1. painpa.title = ...指的是一个新实例MKPointAnnotation它没有以任何方式连接到刚刚拖动的注释。该let pa = MKPointAnnotation()行创建了一个新的实例MKPointAnnotation。这个新实例只存在于本地内存中,甚至没有添加到地图中。

  2. 更新对刚刚拖动的注释实例self.annotationTitle没有影响,title因为annotationTitle只是您声明的一些单独的字符串变量MKPointAnnotation,而添加到地图并刚刚拖动的原始变量与annotationTitle(事实上annotationTitle最初设置为等于注释title中的didTapGoButton不以某种方式将两个字符串“链接”在一起)。


在中,您正在保存对变量didTapGoButton中实际添加(然后拖动)的注释对象的引用。pinpin变量是您可以用来更新title被拖动注释的引用(假设您一次只有一个注释)。

所以在 中didChangeDragState,将上面显示的代码更改为:

self.pin.coordinate = placemark.location.coordinate
self.pin.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

self.annotationTitle = self.pin.title


但是,根据您的要求,请注意,首先保留您自己对注释的引用并不是真正必要的......

didChangeDragState中,您可以访问直接从view传递给方法的参数中拖动的注释。例如:

let ann = view.annotation as MKPointAnnotation
ann.coordinate = placemark.location.coordinate
ann.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

self.annotationTitle = ann.title


旁注:
在拖动注记并对新位置进行反向地理编码后,地理编码坐标很可能与用户将注记拖动到的位置不同。发生这种情况是因为最近的地理编码地址可能离注释被拖动到的位置稍远。所以会发生的是用户完成拖动后注释会移动一点。如果您希望将注释准确地保留在用户拖动它的位置,请不要更新coordinate地理编码器完成块中的注释,而仅更新title. 如果地理编码地址距离实际坐标 X 米或更远,您可能希望将标题设置为“近 xyz”。

于 2014-09-15T13:16:25.650 回答