2017-05-20 9 views
0

私はMKPointAnnotation Sを使用していますスウィフトアプリケーションを作っていますに応答していない、と私は最近、私は私の注釈でメタデータを格納するために必要な問題に走ったので、私は以下のカスタムクラスを作成しました:カスタムMKPointAnnotationは、ユーザーとの対話

class BRETTFAnnotation: MKPointAnnotation { 

    var tag: Int64 

    var name: String 

    init(lat : Double, lon:Double, t : Int64, n: String) { 

     self.tag = t 
     self.name = n 

     super.init() 


     self.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon) 
    } 

} 

マイMKAnnotationViewMKAnnotation viewfor方法を以下に示します。

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    let newAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "reuse") 

    newAnnotation.canShowCallout = true 

    let right = self.button(title: "Yes") 
    right?.addTarget(self, action: #selector(clickedToConfirmNewPoint), for: .touchUpInside) 
    newAnnotation.rightCalloutAccessoryView = right 

    let left = self.button(title: "No") 
    left?.addTarget(self, action: #selector(clickedToCancelNewPoint), for: .touchUpInside) 
    newAnnotation.leftCalloutAccessoryView = left 

    return newAnnotation 
} 

私は私に追加私のカスタムBRETTFAnnotation(をクリックした今までにときに私はに実行している問題があります0)何も起こらない。 MKPointAnnotationBRETTFAnnotationの代わりに)を使用していたときに、地図をクリックしたときにMKAnnotationViewの2つのボタンが表示されます。 MKPointAnnotationの代わりにMKPinAnnotationViewを私のBRETTFAnnotationを使用して接触して表示しようとしています。 注釈を同時にクリックしたときに、自分の注釈を引き続き使用して吹き出しを表示するにはどうすればよいですか?

編集1:以下のコードは、注釈を作成してmapViewに追加する方法です。

 let location = gestureRecognizer.location(in: mapView) 
     let coordinate = mapView.convert(location,toCoordinateFrom: mapView) 

     print("adding lat,long \(coordinate.latitude),\(coordinate.longitude)") 


     lastPoint = BRETTFAnnotation(lat: coordinate.latitude, lon: coordinate.longitude, t: 1, n: "") 

     let annotationView = MKPinAnnotationView(annotation: lastPoint, reuseIdentifier: "reuse") 

     mapView.addAnnotation(lastPoint) 
+0

正確に何をしたいですか?アノテーションのクリックを処理するには、mapView(_ mapView:MKMapView、didSelectビュー:MKAnnotationView)を使用します。 – kuzdu

+0

@kuzdu以前はこれを使用していませんでしたが、カスタム注釈をクリックすると、コールアウトは表示されません。私は、あなたが参照したものがうまくいくかどうかを説明してくれれば、どのような方法でもカスタムアノテーションのクリックを処理しようとしています。 – brettf

答えて

0

:あなたは私のために働くん }

をやりたいですおよびMKAnnotationの代わりにMKPointAnnotationとなります。これを行うことで、私のカスタムクラスはユーザーとのやり取りを受け取り、コールアウトを表示することができました。

0

独自のMKAnnoationを使用するときは、didSelectでアクションを処理できます。次のコードを実装するだけです。

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { 
    if let yourAnnotation = view.annotation as? BRETTFAnnotation { 
     //handle your meta data or/and show UIViews or whatever 
    } 
} 

にfuncのMapViewと(_のMapView:MKMapView、didDeselectビュー:MKAnnotationView){あなたが地図上または別の注釈(前ではなく、選択した注釈) //非表示UIViewsまたはをタップしたときに が呼び出さ取得//私は私のBRETTFAnnotationサブクラスを作ることによって、この問題を解決

class ViewController: UIViewController, MKMapViewDelegate { 

    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { 


    print("didSelect") 
    if let annoation = view.annotation as? MyAnnoation { 
     print("metatag \(annoation.metaTag)") 
    } 
} 

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) { 
    print("didDeselect") 
} 





override func viewDidLoad() { 
    super.viewDidLoad() 


    mapView.delegate = self 
    let annotation = MyAnnoation(n: "name", m: "metaTag") 
    annotation.coordinate = CLLocationCoordinate2D(latitude: 50.0, longitude: 8.0) 
    mapView.addAnnotation(annotation) 
    } 
} 



class MyAnnoation: MKPointAnnotation { 


var name: String? 
var metaTag: String? 


init(n: String, m: String) { 
    self.name = n 
    self.metaTag = m 
    } 
} 
+0

あなたの最初の方法は、注釈のクリックに対する応答ではないようです(私は印刷文を追加し、クリックしたときは何も印刷しません)。これは、私が他の場所で間違っていることを意味しているのでしょうか、それとも私のカスタムクラスと関係がありますか? – brettf

+0

また私のカスタム 'BRETTFAnnotation'は' MKAnnotationView'ではなく 'MKPointAnnotation'のサブクラスです(違いがあるかどうかはわかりません)。 – brettf

+0

mapview.delegate = selfを設定しましたか? didSelectが応答していないか、またはletの中の文ですか? – kuzdu

関連する問題