2

検索フィールドに住所を入力して [go] をクリックすると、何が起きますか。ピンの画像をクリックすると、タイトルの吹き出しがポップアップしてタイトルが表示されます。

title プロパティへの参照となるプロパティ "pin" を作成しました。新しい場所へのドラッグが完了したら、新しい場所への参照を使用してプロパティ タイトル ラベルを設定します。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)")
        }
    }

ドラッグ後にマップ ビューを更新する必要がありますか?

御時間ありがとうございます

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. painは、ドラッグしたばかりの注釈にまったく接続されていない新しいインスタンスをpa.title = ...参照しています。この行は、 の新しいインスタンスを作成します。この新しいインスタンスはメモリ内にローカルに存在するだけで、マップには追加されません。MKPointAnnotationlet pa = MKPointAnnotation()MKPointAnnotation

  2. への更新は、ドラッグされたばかりの注釈インスタンスにはself.annotationTitle影響しません。これは、宣言した別の文字列変数であり、マップに追加されてドラッグされたばかりのオリジナルには、知識や接続がまったくないためです (という事実最初は のアノテーションと同じに設定されていましたが、2 つの文字列を何らかの形で「リンク」しません)。titleannotationTitleMKPointAnnotationannotationTitleannotationTitletitledidTapGoButton


では、変数didTapGoButtonに実際に追加された (そしてドラッグされた) 注釈オブジェクトへの参照を保存していpinます。このpin変数は、ドラッグされた注釈の更新に使用できる参照です(一度に1 つの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 メートル以上離れている場合は、タイトルを「near xyz」のように設定することをお勧めします。

于 2014-09-15T13:16:25.650 に答える