gpt4 book ai didi

ios - 第一次设置后,我似乎无法设置 MKMapView 注释标题

转载 作者:可可西里 更新时间:2023-11-01 00:53:44 26 4
gpt4 key购买 nike

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

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

我已经查看了大量关于类似问题的问题,但没有任何效果。

这是我的 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

}
})


}

})
}

我的 viewForAnimation:

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)")
}
}

拖动后是否需要对 map View 进行某种刷新?

谢谢你的时间

最佳答案

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. pa.title = ... 中的 pa 指的是一个new 实例MKPointAnnotation 没有以任何方式连接到刚刚拖动的注释。 let pa = MKPointAnnotation() 行创建了一个新的 MKPointAnnotation 实例。这个新实例只存在于本地内存中,甚至没有添加到 map 中。

  2. self.annotationTitle 的更新对刚刚拖动的注释实例的 title 没有影响,因为 annotationTitle 是只是你声明的一些单独的字符串变量和添加到 map 并被拖动的原始 MKPointAnnotationannotationTitle 没有任何知识或联系(事实上 annotationTitle 最初设置为等于 didTapGoButton 中注释的 title 不会以某种方式将两个字符串“链接”在一起)。


didTapGoButton 中,您将在 pin 变量中保存对实际添加(然后拖动)的注释对象的引用。此 pin 变量是您可以用来更新被拖动注释的 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


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

关于ios - 第一次设置后,我似乎无法设置 MKMapView 注释标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com