kcamp
kcamp

Reputation: 57

How to Make an Array for Annotations

Not all my annotations will show up in my map because I can't make var annotation = MKPoinatAnnotation the same MKPointAnnotation in fetching the CKrecords(annotation), and in getting directions for an annotation. I'm confused on how to make an array for annotations so I can be able to load all my annotations from the CloudKit database and be able to get directions when the annotation is selected.

let annotation = MKPointAnnotation()
let database = CKContainer.default().publicCloudDatabase
var truck: [CKRecord] = []

func fetch() {

let truePredicate = NSPredicate(value: true)
let eventQuery = CKQuery(recordType: "User", predicate: truePredicate)
let queryOperation = CKQueryOperation(query: eventQuery)


queryOperation.recordFetchedBlock = { (record : CKRecord!) in

    self.truck.append(record)

    self.annotation.title = record["username"] as? String
    self.annotation.subtitle = record["hours"] as? String
    if let location = record["location"] as? CLLocation {
        self.annotation.coordinate = location.coordinate
    }

    print("recordFetchedBlock: \(record)")


    self.mapView.addAnnotation(self.annotation)  

}

self.database.add(queryOperation)

}

How I get directions -

@IBAction func getDirections(_ sender: Any) {
let view = annotation.coordinate

print("Annotation: \(String(describing: view ))")

let currentLocMapItem = MKMapItem.forCurrentLocation()

let selectedPlacemark = MKPlacemark(coordinate: view, addressDictionary: nil)
let selectedMapItem = MKMapItem(placemark: selectedPlacemark)

let mapItems = [selectedMapItem, currentLocMapItem]

let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]

MKMapItem.openMaps(with: mapItems, launchOptions:launchOptions)
}

Upvotes: 1

Views: 952

Answers (1)

ctrl freak
ctrl freak

Reputation: 12385

I'm assuming the contents of the array change depending on the search query. If that is the case, make an array of type MKPointAnnotation:

var points: [MKPointAnnotation] = []

Then fill the array however you fill it and run it through a loop whereby each iteration adds a point to the map:

for point in points {
    mapView.addAnnotation(point)
}

If you have a problem with varying types of annotations, make the array of type CLLocationCoordinate2D and then you can fill the array by accessing MKPointAnnotation.coordinate, for example.

Does this help?

Upvotes: 1

Related Questions