Annotation andere Werte außer title und sub_title hinterlegen

  • Annotation andere Werte außer title und sub_title hinterlegen

    Guten Abend,

    ich habe einen MapView, der mit zahlreichen Annotations aus Core Data "bepinnt" wird.
    Dazu habe ich eine eigene Klasse DisplayMap gebaut,

    Quellcode

    1. @property (nonatomic, assign) CLLocationCoordinate2D coordinate;
    2. @property (nonatomic, copy) NSString *title;
    3. @property (nonatomic, copy) NSString *subtitle;
    4. @property (assign) int dbId;


    Erstellt wird eine Annotation also folgendermaßen:

    Quellcode

    1. DisplayMap *ann = [[DisplayMap alloc] init];
    2. sloc.latitude = [address.gLatitude floatValue];
    3. sloc.longitude =[address.gLongitude floatValue];
    4. ann.title = address.companyName;
    5. ann.subtitle = address.company;
    6. ann.dbId = [address.dbId intValue];
    7. ann.coordinate = sloc;
    8. [mapView addAnnotation:ann];



    Der Annotation habe ich also noch den Wert für dbId mitgegeben. Dabei handelt es sich um eine Id, die ich in CoreData gespeichert habe. Wenn man jetzt auf einen der Pins klickt, erscheint eine Bubble und darin ein Button.
    Wenn ich diesen Button klicke, wird folgende Methode aufgerufen:

    -

    Quellcode

    1. (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
    2. {
    3. // Der NavBarController soll die Detailseite einer Adresse anzeigen
    4. [self.addressNavBarController pushViewController:addressDetailViewController animated: YES];
    5. }


    Ich rufe hier einen neuen View auf, der die passende Adresse zeigt. Diesem müsste ich jetzt das Objekt aus CoreData übergeben, doch wie erhalte ich die Verbindung? Ich hatte überlegt, ich speichere also die dbId und hole mir dann wieder mit einem predicate das richtige Objekt aus CoreData. Doch ich weiß nicht, wie ich an dieser Stelle hier auf dbId zugreifen kann.

    Jemand ne Idee?

    Danke & Gruß
  • planetexpress69 schrieb:

    dercin schrieb:

    mmmh

    Ich habe mir das mal ausgeben lassen:

    Quellcode

    1. NSLog(@"calloutAccessoryControlTapped %@ Button %@",view.annotation.title,view.annotation.dbId);


    Der meldet dann leider es gäbe keine getter-Methode. Der Title wird richtig ausgegeben.

    Casten?



    Ja, natürlich.
    @property (nonatomic, retain) id <MKAnnotation> annotation

    Ansonsten sind doch nur die Methoden des MKAnnotation-Protokoll, und von NSObject bekannt.
    I would be embarrassed if they did not spy on me.
  • dercin schrieb:

    Hi, ja er meldet halt

    Quellcode

    1. error: accessing unknown 'dbId' getter method



    Casten? Gibt es dazu vielleicht ein Tutorial oder so? Bin noch ganz frisch :)

    Quellcode

    1. - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
    2. {
    3. if ([view.annotation isKindOfClass: [DisplayMap class]])
    4. {
    5. DisplayMap *myClickedAnnotation = (DisplayMap *) view.annotation;
    6. }
    7. }


    Ungefähr so.

    Ich würde die Klasse nicht DisplayMao nennen, oder bildest Du noch eine andere Karte ab.
    I would be embarrassed if they did not spy on me.
  • dercin schrieb:

    Hey cool, danke, funktioniert einwandfrei. Macht es vielleicht Sinn, nicht nur die ID des Objektes zu setzen, um dann das Objekt erneut aus Core Data zu holen, sondern das komplette Adress-Objekt direkt der Annotation zu hinterlegen?

    Gruß

    Nein, das geht nicht so einfach, weil es ein Protokoll ist.
    Deshalb ist "Casten" die gängige Praxis im MapKit.

    Wie und woher die Eigenschaften 'title'.etc kommen ist egal, wichtig ist aber, dass es sie gibt.
    Also gehen täte es dann doch wieder, ist eine Frage Deines Designs, letztlich.
    I would be embarrassed if they did not spy on me.