Why are my annotations not appearing in my map view?

南笙酒味 提交于 2019-12-11 18:08:54

问题


I have created a set of "IssueLocation"'s, a class which conforms to the MKAnnotation protocol. Why are my annotations (built from API JSON data) not appearing in my map view ?

Here is the code behind it all:

Class code:

class IssueLocation: NSObject, MKAnnotation {

    var locationName: String
    var campusName: String
    var latitude: Double
    var longitude: Double
    var coordinate: CLLocationCoordinate2D

    init(locationName: String, campusName: String, latitude: Double, longitude: Double, coordinate: CLLocationCoordinate2D) {
        self.locationName = locationName
        self.campusName = campusName
        self.latitude = latitude
        self.longitude = longitude
        self.coordinate = coordinate

        super.init()

    }

    var subtitle: String? {
        if (latitude == 44.22438242146097) {
            return "West Campus"
        } else {
            return "Main Campus"
        }
    }

    var title: String? {
        return locationName
    }

    func mapItem() -> MKMapItem {

        let addressDictionary = [String(kABPersonAddressStreetKey): locationName]

        let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary)

        let mapItem = MKMapItem(placemark: placemark)
        mapItem.name = locationName

        return mapItem
    }
}

Creating a set of IssueLocations:

 func populateMapObjects() {

        if populatingMapObjects {
            return
        }

        populatingMapObjects = true

        self.loadingIndicator.startAnimating()

        var index = 0


        Alamofire.request(GWNetworking.Router.MapObjects).responseJSON() { response in
            if let JSON = response.result.value {

                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)) {

                    /* Making an array of all the node IDs from the JSON file */

                    if (JSON .isKindOfClass(NSArray)) {


                        for _ in JSON as! [Dictionary<String,AnyObject>] {

                            if let issueLocation: IssueLocation = IssueLocation(locationName: "Center of the universe", campusName: "Queen's University", latitude: 44.22661586877309, longitude: -76.49380087852478, coordinate: CLLocationCoordinate2D(latitude: 44.22661586877309, longitude: -76.49380087852478)) {


                                if let locationName = JSON[index]["name"] as? String {
                                    issueLocation.locationName = locationName
                                }

                                if let latitude = JSON[index]["coordinates"]!![1] as? Double {
                                    issueLocation.latitude = latitude
                                }

                                if let longitude = JSON[index]["coordinates"]!![0] as? Double {
                                    issueLocation.longitude = longitude
                                }

                                issueLocation.coordinate = CLLocationCoordinate2D(latitude: issueLocation.latitude, longitude: issueLocation.longitude)

                                index = index+1

                                self.mapObjects.append(issueLocation)
                        }
                    }
                }

                    dispatch_async(dispatch_get_main_queue()) {

                        self.loadingIndicator.stopAnimating()
                        self.populatingMapObjects = false
                        print(self.mapObjects.count)
                }
            }
        }
    }
}

And finally, this is where I try to add the annotations to the map view:

 func loadObjectsIntoMapView() {

    for mapObject in mapObjects {

        let temporaryMapAnnotation = IssueLocation(locationName: mapObject.locationName, campusName: "Main Campus", latitude: mapObject.latitude, longitude: mapObject.longitude, coordinate: mapObject.coordinate)

        if (temporaryMapAnnotation.longitude < -76.50921821594238) {
            temporaryMapAnnotation.campusName = "West Campus"
        }

        self.mapView.addAnnotation(temporaryMapAnnotation)
    }

}

回答1:


Move loadObjectsIntoMapView() into this block:

dispatch_async(dispatch_get_main_queue()) {

                        self.loadingIndicator.stopAnimating()
                        self.populatingMapObjects = false
                        print(self.mapObjects.count)
                }

Calling loadObjectsIntoMapView() in viewDidLoad will have it execute immediately and the data has not come down from the server yet so you will have no mapObject in mapObjects hence no annotations.



来源:https://stackoverflow.com/questions/33558064/why-are-my-annotations-not-appearing-in-my-map-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!