2013-02-11 11 views
8

Ich möchte Ansichten wechseln, wenn ein DetailDisclosure auf einer Karte angeklickt wird, die ich anzeigen. Mein aktueller Code ist wie folgt:MKAnnotationView Push-to-View-Controller, wenn DetailDeclosure-Schaltfläche angeklickt wird

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
calloutAccessoryControlTapped:(UIControl *)control 
{ 
    DetailViewController *detailViewController = [[DetailViewController alloc] 
    initWithNibName:@"DetailViewController" bundle:nil]; 
    detailViewController.title = dictionary[@"placeLatitude"] 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 

ich auf die View-Controller mit dieser schieben kann, aber ich habe nicht herausgefunden, wie es zu zwingen Details verwendet, um aus dem JSON-Array zu ziehen, um die Karte in dem ersten zu erzeugen Ort. Ich ziehe Daten wie folgt, um die Karte zu generieren:

for (NSDictionary *dictionary in array) 
{ 
    // retrieve latitude and longitude from the dictionary entry 

    location.latitude = [dictionary[@"placeLatitude"] doubleValue]; 
    location.longitude = [dictionary[@"placeLongitude"] doubleValue]; 

    //CAN I LOAD THE TITLE/ID OF THE LOCATION HERE? 

Ich weiß, ich bin ein bisschen vom Ziel entfernt. Vielleicht hilft nur ein Tritt in die richtige Richtung. Vielen Dank!

Antwort

11

Wenn Sie Storyboards verwenden und einen Übergang von Ihrer aktuellen Szene zu Ihrer Zielszene haben, können Sie einfach auf calloutAccessoryControlTapped antworten. Zum Beispiel:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    [self performSegueWithIdentifier:@"Details" sender:view]; 
} 

Natürlich können Sie für die Art von Anmerkung mit diesem view etc. assoziiert überprüfen, wenn Sie verschiedene segues haben Sie für verschiedene Annotationstypen anrufen möchten.

Und natürlich, wenn Sie wie üblich Informationen in dieser nächsten Szene in prepareForSegue weitergeben möchten.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Details"]) 
    { 
     MKAnnotationView *annotationView = sender; 
     [segue.destinationViewController setAnnotation:annotationView.annotation]; 
    } 
} 

Wie Sie sehen können, gebe ich das annotation Objekt auf meine nächste Ansicht. Wenn Sie in Ihrer JSON-Struktur zusätzliche Felder haben, die jeder Anmerkung zugeordnet sind, besteht eine einfache Lösung darin, Ihrer benutzerdefinierten Ansicht Eigenschaften hinzuzufügen, die den einzelnen Feldern zugeordnet sind, die Sie verfolgen möchten. Wechseln Sie einfach zu der benutzerdefinierten Klasse ".h" für Anmerkungen und fügen Sie die gewünschten Eigenschaften hinzu. Und dann, wenn Sie Ihre eigenen Anmerkungen erstellen (die zur Karte hinzugefügt werden sollen), legen Sie einfach auch diese Eigenschaften fest. Wenn Sie diese Anmerkung an den nächsten View-Controller übergeben, sind alle gewünschten Eigenschaften dort verfügbar.


Klar, wenn Sie NIBs verwenden, tun nur die NIB Äquivalenten, was auch immer Sie den nächsten View-Controller für die Instanziierung wollen, einstellen, was Eigenschaften, die Sie wollen, und entweder es schieben oder es modal präsentiert, zum Beispiel:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    DetailsViewController *controller = [[DetailsViewController alloc] initWithNibName:nil 
                       bundle:nil]; 
    controller.annotation = annotationView.annotation; 
    [self.navigationController pushViewController:controller animated:YES]; // or use presentViewController if you're using modals 
} 
+0

Dank Rob, muss ich Storyboards verwenden, um eine Segue zu haben? – Brandon

+0

Ich sehe hinein. Wie immer - YOU ROCK – Brandon

+0

Wie kann ich auf die Felder in der neuen Ansicht zugreifen? Ich versuche das Gleiche in meiner App zu erreichen. –

Verwandte Themen