2009-08-17 14 views
1

Ok, ich habe dieses Problem. Ich möchte manuell mehrere Annotationen zu einer Map hinzufügen. Wenn ich nur eine Anmerkung hinzufüge, funktioniert es einwandfrei. Die Nadel fällt, du kannst sie anklicken, um ihre Legende zu sehen, das Leben ist gut.Problem beim Hinzufügen mehrerer Anmerkungen zur Karte

Das Problem kommt, wenn ich mehr als eins hinzufügen möchte. Wenn ich die zweite hinzufüge, sind die Pins plötzlich nicht mehr richtig gefärbt (dh abhängig von ihrer Größe sollten sie eine bestimmte Farbe haben, aber jetzt sind sie beide gleich ...) und, noch wichtiger, wenn du darauf klickst, um ihre zu sehen Callout, stürzt die App mit exex_bad_access ab. Ich habe wirklich keine Ahnung, was los ist, vielleicht füge ich der Karte zu viele Ansichten hinzu? Aber es sind nur 9 Pins und die Pins selbst fügen sich gut. Hier ist mein Code ...

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSMutableArray *stops = [[NSMutableArray alloc] init]; //Get list of all the stops available 
    Bus *bus1 = [[Bus alloc] init];       // Bus 1 holds the stops 
    stops = [bus1 returnStops]; 
    for (NSString *stop in stops)       //Go through each stop to add annotation to map 
    { 
     Bus *bus2 = [bus1 initWithStop:stop];    //Create an instance of bus with a given stop 
     MapAnnotation *eqAnn = [MapAnnotation annotationWithBus:bus2]; 
     [self.mapView addAnnotation:eqAnn];     //Add the annotation to the map 
     //[eqAnn release]; 
     //[bus2 release]; 
    } 
    [self recenterMap]; 
    [stops release]; 

} 
- (MKAnnotationView *)mapView:(MKMapView *)mapView 
      viewForAnnotation:(id <MKAnnotation>)annotation { 
    MKAnnotationView *view = nil; 
    if(annotation != mapView.userLocation) { 
     MapAnnotation *eqAnn = (MapAnnotation*)annotation; 
     view = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"busLoc"]; 
     if(nil == view) { 
      view = [[[MKPinAnnotationView alloc] initWithAnnotation:eqAnn 
                reuseIdentifier:@"busLoc"] autorelease]; 
     } 
     CGFloat magnituide = [eqAnn.bus.magnitude floatValue]; 

     if(magnituide >= .80f) { 
      [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorRed]; 
     } else if(magnituide >= .60f) { 
      [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorPurple]; 
     } else 
     { 
      [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorGreen]; 
     } 
     [(MKPinAnnotationView *)view setAnimatesDrop:YES]; 
     [view setCanShowCallout:YES]; 
    } 

    return view; 
} 

sogar versucht, die zweite Funktion zu entfernen, aber es hat nichts getan.

Danke für die Hilfe! PS Ich sollte auch hinzufügen, es gibt in der Regel eine oder zwei Pins aus der 9, die funktioniert, wenn Sie auf die Annotation klicken ...

Wenn ich sogar manuell nur zwei Anmerkungen manuell im Programm versuchen (dh, entfernen Sie die Schleife) , es schlägt immer noch fehl und die Farbe ist immer noch falsch ...

+0

Auch sollte ich hinzufügen, dass, wenn ich hinzufügen, zwei Anmerkungen zu der Karte manuell, das Ding stürzt auf die gleiche Weise. Bus * bus2 = [bus1 initWithStop: [stoppt objectAtIndex: 0]; MapAnnotation * eqAnn = [MapAnnotation annotationWithBus: bus2]; [self.mapView AddAnnotation: eqAnn]; Bus * bus2 = [bus1 initWithStop: [Anschläge objectAtIndex: 1]; MapAnnotation * eqAnn = [MapAnnotierung annotationWithBus: bus2]; [self.mapView addAnnotation: eqA nn]; Dies schlägt immer noch fehl. – kodai

Antwort

0

SO die Antwort war, dass ich bus1 das init-Objekt weiterschickte, so dass es verwirrt wurde. .

„Hallo David,

Ihr Datenmodell mir abgespritzt sehen Sie haben nur ein Bus-Objekt, das Sie immer wieder initWithStop senden: bis

Hoffnung, das hilft..

Viel Glück! "

Danke Jungs für Ihre Hilfe! Sie alle halfen mir ziemlich viel!

1

Es scheint, dass Ihre Speicherverwaltung der stops Variable falsch ist. Sie ordnen ein veränderbares Array zu, ersetzen dieses Array dann durch den Rückgabewert -[Bus returnStops] und geben das dann frei. Auch ist es nicht klar, was los ist mit bus2 - gibt -[Bus initWithStop:] eine andere Instanz von Bus zurück? Es ist nicht üblich, eine Methode -init* auf ein bereits initialisiertes Objekt zu senden. Ich denke, dass Sie wahrscheinlich durch die Speicherverwaltungskonventionen in Cocoa Touch verwirrt sind. Hier ist eine Sammlung von Artikeln und anderen Referenzen on Cocoa memory management (das ist das gleiche Tier).

0

Haben Sie versucht, AddAnnotations anstelle von Annotation zu verwenden? - (void) addAnnotations: (NSArray *) Anmerkungen. Dies könnte für Sie funktionieren ... aber wenn Sie sich die obige Antwort und die weitere Überprüfung ansehen, haben Sie einige Probleme mit der Speicherverwaltung in Ihrem viewDidLoad (obwohl dies möglicherweise nicht die Ursache Ihres Problems ist, aber es könnte sein). Wenn Sie zuerst das Array (Stopps) zuweisen und es dann mit einem Array im Bus-Objekt verbinden, wird dies zu einem Leck führen. Außerdem geben Sie dann das Array frei, das den Absturz verursachen könnte, da Sie das Array freigegeben haben, das sich tatsächlich im Bus-Objekt befindet, ohne dass eine Referenzzahl darauf erhöht wurde. Ich bin nicht sicher, was initWithStop tut, aber Sie könnten auch hier ein Leck bekommen, wenn initWithStop das Objekt behält.

0

Ich würde es nicht ein Speicherverwaltungsproblem nennen - ich würde nur sagen, dass Sie Array-Referenzen falsch verwenden.

Nachdem das Array mit NSMutableArray * stops = [[NSMutableArray alloc] init] erstellt wurde, besteht der nächste Schritt in der Verwendung von [stops addObject:] zum Hinzufügen jedes Stopps, den Sie speichern möchten.

Danach? Es ist nicht klar, was Sie wirklich tun wollen.

Verwandte Themen