codingTia
codingTia

Reputation: 31

IOS Map Pins are not Showing?

I am struggling with my iOS code. The overall goal of the project is to show the pins on the map, I've tried multiple ways to make the pins appear on the map such as the below, I am not sure what I am doing wrong. The code runs fine, the pins are not appearing. I've made changes to my functions but seem to get the same error. Any insight on what I may be missing?

"import UIKit import MapKit

class MapViewController: UIViewController, MKMapViewDelegate {

@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
@IBOutlet weak var logout: UIBarButtonItem!
@IBOutlet weak var refresh: UIBarButtonItem!
@IBOutlet weak var pinDrop: UIBarButtonItem!


var studentLocation = [StudentInformation]()
var annotations = [MKPointAnnotation]()

override func viewDidLoad() {
    super.viewDidLoad()
    
    // Do any additional setup after loading the view.
}

override func viewDidAppear (_ animated: Bool) {
    super.viewDidAppear(true)
    getStudentPins()
}

@IBAction func refresh(_ sender: UIBarButtonItem) {
    getStudentPins ()
}
@IBAction func logout(_ sender: UIBarButtonItem) {
    self.activityIndicator.startAnimating()
    UdacityClient.logout {
        DispatchQueue.main.async {
            self.dismiss(animated: true, completion: nil)
            self.activityIndicator.stopAnimating()
        }
    }
}

@IBAction func addLocation(_ sender: Any) {
    performSegue(withIdentifier: "addLocation", sender: nil)
}

func getStudentPins () {
    self.activityIndicator.startAnimating()
    UdacityClient.getStudentLocations() { locations, error in
        self.mapView.removeAnnotations(self.annotations)
        self.annotations.removeAll()
        self.studentLocation = locations ?? []
        for dictionary in locations ?? [] {
            let latitude = CLLocationDegrees(dictionary.latitude ?? 0.0)
            let longitude = CLLocationDegrees(dictionary.longitude ?? 0.0)
            let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
            let firstName = dictionary.firstName
            let lastName = dictionary.lastName
            let mediaURL = dictionary.mediaURL
            let annotation = MKPointAnnotation()
            annotation.coordinate = coordinate
            annotation.title = "\(firstName) \(lastName)"
            annotation.subtitle = mediaURL
            self.annotations.append(annotation)
        }
        DispatchQueue.main.async {
            self.mapView.addAnnotations(self.annotations)
            self.activityIndicator.stopAnimating()
        }
    }
}

private func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotation? {
    let reuseId = "pin"
    var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? MKPinAnnotationView
    if pinView == nil {
        pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pinView!.canShowCallout = true
        pinView!.pinTintColor = .green
        pinView!.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
    }
    else {
        pinView!.annotation = annotation
    }
    return pinView?.annotation
}

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
    if control == view.rightCalloutAccessoryView {
        if let toOpen = view.annotation?.subtitle {
            openLink(toOpen ?? "")
        }
    }
}

}"

Upvotes: 0

Views: 305

Answers (1)

msusare
msusare

Reputation: 486

They're called annotations in the MapKit and you should instantiate them like so:

let annotation = MKPointAnnotation() 

then in the viewDidLoad() method just set the coordinates and add them to the map like:

annotation.coordinate = CLLocationCoordinate2D(latitude: 11.12, longitude: 12.11)
mapView.addAnnotation(annotation)

The numbers are your coordinates. Try by adding sample coordinates on the map first and then add all coordinates which you are getting from the client.

you can also add more information using:

annotation.title = "Your text here"
//You can also add a subtitle that displays under the annotation such as
annotation.subtitle = "One day I'll go here..."

Upvotes: 0

Related Questions