2017-01-27 15 views
1

2番目の注釈/ピン(注釈2)に異なるボタンアクションを追加することができます。注釈ピンはどのようにお互いに異なる作業を行うかを示します。私は自分のプロジェクトでSwift3を使用しています。これが私のコードです。ありがとうswift2を使用して、マップビューの2番目の注釈/ピンに異なるボタンアクションを追加する方法

これは私のコードです。

import UIKit 
    import MapKit 
    import CoreLocation 

class MyAnnotation: MKPointAnnotation { 
     var uniqueId: Int! 
} 

    class LocationViewController: UIViewController , MKMapViewDelegate , CLLocationManagerDelegate{ 

    @IBOutlet weak var map: MKMapView!{ 

    didSet{ 
     map.delegate = self 
    } 
} 

@IBOutlet weak var locationInfo: UITextView! 


override func viewDidLoad() { 
    super.viewDidLoad() 


    let locations = CLLocationCoordinate2DMake(33.314627, 44.303500) 

    let location2 = CLLocationCoordinate2DMake(33.312149, 44.3024567) 

    let span = MKCoordinateSpanMake(0.02, 0.02) 

    let span2 = MKCoordinateSpanMake(0.02, 0.02) 

    let region = MKCoordinateRegionMake(locations, span) 

    let region2 = MKCoordinateRegionMake(location2, span2) 


    map.setRegion(region, animated: true) 

    map.setRegion(region2, animated: true) 


    let annotation = MyAnnotation() 
    //annotation.setCoordinate(location) 
    annotation.coordinate = locations 
    annotation.title = "Zaid Homes" 
    annotation.subtitle = "Hay aljameaa" 

    annotation.uniqueId = 1 

    map.addAnnotation(annotation) 

    let annotation2 = MyAnnotation() 
    //annotation.setCoordinate(location) 
    annotation2.coordinate = location2 
    annotation2.title = "Zaid " 
    annotation2.subtitle = "aljameaa" 

    annotation.uniqueId = 2 

    map.addAnnotation(annotation2) 

    //Showing the device location on the map 
    self.map.showsUserLocation = true; 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    var view = mapView.dequeueReusableAnnotationView(withIdentifier: "AnnotationView Id") 
    if view == nil{ 
     view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "AnnotationView Id") 
     view!.canShowCallout = true 
    } else { 
     view!.annotation = annotation 
    } 

    view?.leftCalloutAccessoryView = nil 
    view?.rightCalloutAccessoryView = UIButton(type: UIButtonType.detailDisclosure) 


    return view 
} 

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 

    if (control as? UIButton)?.buttonType == UIButtonType.detailDisclosure { 
     mapView.deselectAnnotation(view.annotation, animated: false) 
     if let myAnnotation = view.annotation as? MyAnnotation { 
      if (myAnnotation.uniqueId == 1) { 
       performSegue(withIdentifier: "info", sender: view) 
      } 
      else { 
       performSegue(withIdentifier: "info2", sender: view) 
      } 
     }    
    } 
} 

} 

答えて

1

最も簡単な方法は知っていますカスタム注釈クラスを作成し、その注釈を追加します。したがって、1つのアノテーションクラスMyAnnotation子クラスMKPointAnnotationを作成し、複数のアノテーションで1つのuniqueIdを維持します。

class MyAnnotation: MKPointAnnotation { 
    var uniqueId: Int! 
} 

今、あなたはタイプMyAnnotation代わりのMKPointAnnotationの注釈を追加する必要があります。

let annotation = MyAnnotation() 
annotation.coordinate = locations 
annotation.title = "Zaid Homes" 
annotation.subtitle = "Hay aljameaa" 
//Set uniqueId for annotation 
annotation.uniqueId = 1  
map.addAnnotation(annotation) 

let annotation2 = MyAnnotation() 
annotation2.coordinate = location2 
annotation2.title = "Zaid " 
annotation2.subtitle = "aljameaa" 
//Set uniqueId for annotation 
annotation2.uniqueId = 2  
map.addAnnotation(annotation2) 

今、あなたがタップされた注釈にcalloutAccessoryControlTapped方法でこのuniqueIdを確認してください。

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 

    if (control as? UIButton)?.buttonType == UIButtonType.detailDisclosure { 
     mapView.deselectAnnotation(view.annotation, animated: false) 
     if let myAnnotation = view.annotation as? MyAnnotation { 
      if (myAnnotation.uniqueId == 1) { 
       performSegue(withIdentifier: "info1", sender: view) 
      } 
      else { 
       performSegue(withIdentifier: "info2", sender: view) 
      } 
     }    
    } 
} 
+0

助けてくれてありがとうございますが、注釈2のボタンを押したときにエラー(致命的なエラー:予期せずnilが選択値をアンラッピングしている間に見つかりました)のif(myAnnotation.uniqueId == 1)。 –

+0

uniqueIdを1と2に設定するのを忘れましたあなたが 'MyAnnotation'のインスタンスを作成しているときに私の答えをチェックしてください。この行' annotation.uniqueId = 1' –

+0

いいえ、私はそれをしますが、それでも同じエラーです。もっと喜ばせてください。 –

1

あなたがMKPointAnnotationの2つのサブクラスを作成することによってこれを行うことができ、その後、デリゲートのメソッドでは、あなたがこれを行うことができます:

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 

if view is subClass1 { 
    // do action for subclass 1 

} 
else if view is subClass2 { 
    // do action for subClass 2 
} 
} 

これはあなたの問題を解決する場合は私に知らせてください。

あなたの実装はこのexempleような、よりシンプルな委任することができます

更新:あなたはタップ注釈が使用されている

class ClassA:MKPointAnnotation{ 
 
    func doActionWhenCalloutTapped(){ 
 
     //do some action 
 
    } 
 
} 
 

 
class ClassB:ClassA{ 
 
    override func doActionWhenCalloutTapped(){ 
 
     //do some actions for annotation of type B 
 
    } 
 
} 
 

 
class ClassC:ClassA{ 
 
    override func doActionWhenCalloutTapped(){ 
 
     //do some actions for annotation of type C 
 
    } 
 
} 
 

 
func viewDidLoad(){ 
 
    super.viewDidLoad() 
 
    let annotation = ClassB() 
 
    //annotation.setCoordinate(location) 
 
    annotation.coordinate = locations 
 
    annotation.title = "Zaid Homes" 
 
    annotation.subtitle = "Hay aljameaa" 
 
    
 
    map.addAnnotation(annotation) 
 
    
 
    let annotation2 = ClassC 
 
    //annotation.setCoordinate(location) 
 
    annotation2.coordinate = location2 
 
    annotation2.title = "Zaid " 
 
    annotation2.subtitle = "aljameaa" 
 
    
 
    map.addAnnotation(annotation2) 
 
} 
 

 
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 
 
    
 
    (view.annotation as! ClassA).doActionWhenCalloutTapped() 
 
    
 
}

+0

これらの2つのサブクラスの内容を教えてください。 –

+0

thaïは、この例では空白(余分な機能はありません)です。しかし、これにより、あなたは(未来にあるかもしれない)異なる行動を持ついくつかの新しい機能を持つことができます。 –