为什么我的注释没有出现在我的地图视图中?

时间:2015-11-06 01:41:51

标签: ios swift mkmapview mkannotation mkannotationview

我创建了一组“IssueLocation”,这是一个符合MKAnnotation协议的类。为什么我的注释(由API JSON数据构建)没有出现在我的地图视图中?

以下是所有背后的代码:

班级代码:

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
    }
}

创建一组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)
                }
            }
        }
    }
}

最后,我尝试将注释添加到地图视图中:

 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 个答案:

答案 0 :(得分:1)

将loadObjectsIntoMapView()移动到此块中:

dispatch_async(dispatch_get_main_queue()) {

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

在viewDidLoad中调用loadObjectsIntoMapView()会使它立即执行,并且数据还没有从服务器中下来,因此mapObjects中没有mapObject,因此没有注释。