2017-12-19 2 views
0

Nicht alle meine Anmerkungen werden in meiner Karte angezeigt, da ich var annotation = MKPoinatAnnotation nicht die gleiche MKPointAnnotation beim Abrufen der CKrecords (Anmerkung) und beim Abrufen von Anweisungen für eine Anmerkung erstellen kann. Ich bin verwirrt darüber, wie man ein Array für Annotationen erstellt, damit ich alle meine Anmerkungen aus der CloudKit-Datenbank laden kann und in der Lage bin, Anweisungen zu erhalten, wenn die Annotation ausgewählt ist.So erstellen Sie ein Array für Anmerkungen

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) 

} 

Wie ich 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) 
} 

Antwort

0

ich den Inhalt der Arrays Änderung auf der Suchabfrage in Abhängigkeit davon aus. Wenn das der Fall ist, ein Array vom Typ machen MKPointAnnotation:

var points: [MKPointAnnotation] = [] 

Dann das Array füllen aber es Sie füllen und es durch eine Schleife laufen, wobei jede Iteration einen Punkt auf der Karte ergänzt:

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

Wenn Sie ein Problem mit verschiedenen Annotationstypen haben, erstellen Sie das Array vom Typ CLLocationCoordinate2D, und dann können Sie das Array füllen, indem Sie beispielsweise auf MKPointAnnotation.coordinate zugreifen.

Hilft das?

+0

Leider funktioniert der erste Teil nicht. Ich bin immer noch verwirrt darüber, was ich möchte, wenn ich ein Array vom Typ 'CLLocationCoordinate2D' mache. Danke für die Hilfe tho! – kcamp

+1

Sowohl die Annotation 'CKRecords' als auch' MKPointAnnotation' enthalten Längen- und Breitenkoordinaten. Wenn Sie möchten, dass ein einzelnes Array beide Annotationen enthalten kann, ändern Sie den Typ des Arrays in "CLLocationCoordinate2D". Mit der For-In-Schleife können Sie eine Sammlung von Anmerkungen aufnehmen und sie gleichzeitig derselben Karte hinzufügen. – slickdaddy

+0

Okay, es macht mehr Sinn. Ich bin nicht sicher, wo ich die For-In-Schleife starten soll. Ich habe es in der Abfrage versucht, aber "MKPointAnnotation.coordinate" konnte nicht verwendet werden, wenn ich das tat. Mein Schlechter ich bin etwas, das zum Codieren neu ist, und for Schleifen sind noch zu mir verwirrend ... – kcamp

Verwandte Themen