0

I'm trying to add a button to then do to a new viewcontroller to my MKPointAnnotations

I've looked closely at these two questions

How to add button to MKPointAnnotation in Swift

How to add a button to the MKPointAnnotation?

and they both have

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

as part of the solution but when I implement this function it is not being called (I'm assuming here that its meant to be called automatically like with cells in tableviews or collectionviews in swift). An insight was to what I should try next would be amazing because overall I feel like this should be easy I'm missing something fundamental.

import UIKit
import Foundation
import MapKit
import CoreLocation

class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {

    var screenWidth : CGFloat = 0.0
    var screenHeight : CGFloat = 0.0

    var mapView = MKMapView()

    var annotations : [MKPointAnnotation] = []

    var annotationView = MKAnnotationView()

    let lm = CLLocationManager()

    let regionRadius: CLLocationDistance = 1000

    var flag : Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()

        screenWidth = UIScreen.main.bounds.width
        screenHeight = UIScreen.main.bounds.height

        mapView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight)
        self.view.addSubview(mapView)
        lm.delegate = self
        lm.desiredAccuracy = kCLLocationAccuracyBest
        lm.requestWhenInUseAuthorization()
        lm.startUpdatingLocation()


        let detailButton: UIButton = UIButton(type: UIButtonType.detailDisclosure) as UIButton
        annotationView.rightCalloutAccessoryView = detailButton

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            let coordinateRegion = MKCoordinateRegionMakeWithDistance(locations[locations.count-1].coordinate, regionRadius * 0.5, regionRadius * 0.5)
            mapView.setRegion(coordinateRegion, animated: true)


        if flag == false {
            addAnnotation(latitude: locations[locations.count-1].coordinate.latitude, longitude: locations[locations.count-1].coordinate.longitude)
            flag = true
        }
    }

    func addAnnotation(latitude: Double, longitude: Double){
        let annotation = MKPointAnnotation()
        annotation.coordinate.latitude = latitude
        annotation.coordinate.longitude = longitude
        annotation.title = "here"

        annotations.append(annotation)

        mapView.addAnnotation(annotations[0])
    }



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

        print("fuddddge not working")

        let pinView = MKPinAnnotationView()
        return pinView

    }



    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}
Blue
  • 1,408
  • 4
  • 17
  • 36

1 Answers1

0

This method is called when you add annotation of type MKAnnotation , so you should first create a subclass of MKAnnotation

//  add them inside MKAnnotation class below import

func == (left: PinColor, right: PinColor) -> Bool
{
  return left.rawValue == right.rawValue
}
enum PinColor : String
{
    case Blue = "Blue"
    case Red = "Red"
    case Green = "Green"
    case Purple = "Purple"

    /* We convert our pin color to the system pin color */
    func toPinColor() -> MKPinAnnotationColor
    {
        switch self
        {
        case .Red:
            return .red
        case .Green:
            return .green
        case .Purple:
            return .purple
        default:
            return .red
        }
    }
}


class MyAnnotation: NSObject, MKAnnotation
{
  var coordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(0, 0)
  var title: String!
  var subtitle: String!
  var pinColor: PinColor!

  init(coordinate: CLLocationCoordinate2D, title: String,
     subtitle: String,
     pinColor: PinColor)
  {
     self.coordinate = coordinate
     self.title = title
     self.subtitle = subtitle
     self.pinColor = pinColor
     super.init()
  }

}

Then add the annoation

let blueLocation = CLLocationCoordinate2D(latitude: ..... , longitude: .... )

let blueAnnotation = MyAnnotation(coordinate: blueLocation, title:"",subtitle: "",pinColor: .Green) 

self.myMapView.addAnnotation(blueAnnotation)

//

func mapView(_ mapView: MKMapView,viewFor annotation: MKAnnotation) -> MKAnnotationView?
{
    if annotation is MyAnnotation == false
    {

        return nil
    }

    let senderAnnotation = annotation as! MyAnnotation

    let pinReusableIdentifier = senderAnnotation.pinColor.rawValue

    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: pinReusableIdentifier)

    if annotationView == nil
    {            
        annotationView = MKAnnotationView(annotation: senderAnnotation,                                                                                                reuseIdentifier: pinReusableIdentifier)
        annotationView!.canShowCallout = true
    } 

    if senderAnnotation.pinColor == PinColor.Green
    {
         let pinImage = UIImage(named:"name.png")

         annotationView!.image = pinImage

    }

    return annotationView 

 }
Shehata Gamal
  • 98,760
  • 8
  • 65
  • 87
  • Can I ask where the pincolor stuff comes from? You seem to be using it as an identifier – Blue Apr 06 '18 at 21:40