2016-03-24 9 views
0

Ich arbeite mit einem Mapview nicht eine Tabellenansicht, aber ich weiß nicht, was zu ersetzen IndexPath.row.Was anstelle von indexPath.row zu verwenden? für Nicht-Tabelle?

Ich habe eine Mapview mit Anmerkungen, wenn die Info-Schaltfläche einer Anmerkung gedrückt wird, dann frage ich meine CK-Datenbank ab und gebe den Datensatz zurück, der ein Namensfeld hat, das dem Namen der Anmerkung entspricht. Dies gibt ein [CKRecord] mit einem einzelnen Datensatz zurück, da keine übereinstimmenden Namen vorhanden sind.

An diesem Punkt mit einem Tableview ich folgendes tun würde, um auf die Daten zugreifen ...

let placeInfo = selectedData[indexPath.row] 
let placeName = placeInfo.objectForKey("Name") as! String 
let placeCity = placeInfo.objectForKey("City") as! String 

Da ich eine Tableview nicht bin mit, ich benutze keine indexPath müssen . Da mein [CKRecord] Objekt nur einen einzelnen Datensatz enthält, dachte ich, ich indexPath.row mit der Array Lage des Datensatz ...

let placeInfo = selectedPlace[0] //also tried 1 

Diese Linien erzeugen einen Index aus Bereichsfehler ersetzen könnte.
Ich habe alles versucht, was ich weiß, und wie Sie sich vielleicht vorstellen können, bin ich im Moment nicht gerade großartig im schnellen oder programmieren im Allgemeinen.

Hier ist die vollständige mapView Funktion verwende ich ...

func mapView(mapView: MKMapView, annotationView: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 

    let cloudContainer = CKContainer.defaultContainer() 
    let publicData = cloudContainer.publicCloudDatabase 

    let tappedPlace = annotationView.annotation!.title!! as String 

    let predi = NSPredicate(format: "Name = %@", tappedPlace) 
    let iquery = CKQuery(recordType: "Locations", predicate: predi) 

    publicData.performQuery(iquery, inZoneWithID: nil, completionHandler: { 
     (results, error) -> Void in 

     if error != nil { 
      print(error) 
      return 
     } 

     if let results = results { 
      print("Downloaded data for selected location for \(tappedPlace)") 

      NSOperationQueue.mainQueue().addOperationWithBlock() { 
       self.selectedPlace = results 
      } 
     } 
    }) 

    let placeInfo = selectedPlace[0] 
    let placeName = placeInfo.objectForKey("Name") as! String 
    //returns Index out of range error for placeInfo line 


    //need data before segue 
    //performSegueWithIdentifier("fromMap", sender: self) 
} 

Antwort

2

Ihr Problem ist, dass Sie versuchen, selectedPlace zuzugreifen, bevor es tatsächlich von Ihrem Abschluss-Handler unterzeichnet ist. Ihr 'publicData.performQuery' scheint ein asynchroner Vorgang zu sein, und das bedeutet, dass das Steuerelement aus diesem Aufruf herauskommt, noch bevor der Beendigungshandler ausgeführt wird (dies wird im Falle eines asynchronen Aufrufs erwartet). Und Sie erreichen die Linie sofort -

let placeInfo = selectedPlace[0] 

Aber die Daten sind noch nicht fertig, und Sie erhalten die Ausnahme. Nun sind diese zu lösen, Info Extraktion bewegen und Segue Code innerhalb des Abschluss-Handler als shown-

publicData.performQuery(iquery, inZoneWithID: nil, completionHandler: { 
    (results, error) -> Void in 

    if error != nil { 
     print(error) 
     return 
    } 

    if let results = results { 
     print("Downloaded data for selected location for \(tappedPlace)") 

     NSOperationQueue.mainQueue().addOperationWithBlock() { 
      self.selectedPlace = results 
       if(results.count > 0){ 

       let placeInfo = selectedPlace[0] 
       let placeName = placeInfo.objectForKey("Name") as! String 
       //Do any other computations as needed. 
       performSegueWithIdentifier("fromMap", sender: self) 
      } 
     } 
    } 
}) 

ausführt Dies sollte Ihr Problem beheben.

+0

Ja, das ist behoben! Vielen Dank! – ALTVisual

Verwandte Themen