Open second ViewController with a button in annotationView

Hello,

I have 25 annotations on map. When user tap on each annotation it shows Title and description of the annotation with the buttons (rightCalloutAccessoryView). I would like this button to open second VC called SecondController, ThirdController etc. . Normally I do it with this code:


guard let vc = storyboard?.instantiateViewController(withIdentifier: "second_vc") as? SecondController else {
            return
        }
        present(vc, animated: true)
        }

But since the button is in the Annotation I cant put it in IBAction. Also I Would like to have each button for each VC (each annotation - each VC). Is it a good way to show the description of the place in this seperate ViewControllers? I have 25 annotations, so It would be 25 VCs. Here is my code:

import UIKit
import MapKit

class ViewController: UIViewController, MKMapViewDelegate {

    let initialLocation = CLLocation(latitude: 85.10786543576327, longitude: 11.03851472106171)

    let locationManager = CLLocationManager()

    struct Place {

      let name: String

      let description: String

      let type: String

      let lattitude: CLLocationDegrees

      let longtitude: CLLocationDegrees

        var coordinate: CLLocationCoordinate2D {

            .init(latitude: lattitude, longitude: longtitude)

        }

    }

let location = CLLocation()

    let places = [Place(name: "One", description: "One", type: "one", lattitude: 81.108187, longtitude: 12.075812),

                   Place(name: "Two", description: "Two", typ: "two", lattitude: 81.076187, longtitude: 11.000563),

                   Place(name: "Three", description: "Three", typ: "Three", lattitude: 81.076187, longtitude: 11.000563)]

    override func viewDidLoad() {

        super.viewDidLoad()

        mapView.centerToLocation(initialLocation)

        mapView.register(MKMarkerAnnotationView.self, forAnnotationViewWithReuseIdentifier: "identifier")

        checkLocationServices()

        findPlaces(places)

        mapView.delegate = self

    }

[...]

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

        guard !(annotation is MKUserLocation) else { return nil }

        mapView.delegate = self

        let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: String(annotation.hash))

        let identifier = "identifier"

        annotationView.canShowCallout = true

        guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier, for: annotation) as? MKMarkerAnnotationView else { return nil }

        let rightButton = UIButton(type: .detailDisclosure) // HERE IS THIS BUTTON, BUT I NEED EACH BUTTON FOR EACH ANNOTATION - THIS WAY IT SHOULD BE ONE FOR ALL OF THEM

        rightButton.tag = annotation.hash

        annotationView.canShowCallout = true

        annotationView.rightCalloutAccessoryView = rightButton

[...]

Thank you in advance for your help.

Answered by pawelzet in 692280022

Ok, so I've added this and it works with objc function:

 @objc func didClickDetailDisclosure(button: UIButton) {

        guard let vc = storyboard?.instantiateViewController(withIdentifier: "second_vc") as? SecondController else {

                    return

                }

                present(vc, animated: true)

    }

and this in my mapView func:

rightButton.addTarget(self, action: #selector(didClickDetailDisclosure(button:)), for: .touchUpInside)

But still I would like each annotation to open each VC. Thank you in advance for your help.

Accepted Answer

Ok, so I've added this and it works with objc function:

 @objc func didClickDetailDisclosure(button: UIButton) {

        guard let vc = storyboard?.instantiateViewController(withIdentifier: "second_vc") as? SecondController else {

                    return

                }

                present(vc, animated: true)

    }

and this in my mapView func:

rightButton.addTarget(self, action: #selector(didClickDetailDisclosure(button:)), for: .touchUpInside)

But still I would like each annotation to open each VC. Thank you in advance for your help.

Open second ViewController with a button in annotationView
 
 
Q