Problem Hinzufügen mehrere Anmerkungen zur Karte

stimmen
1

Ok, so habe ich dieses Problem. Was ich tun möchte, ist manuell mehrere Anmerkungen zu einer Karte hinzufügen. Wenn ich nur eine Anmerkung hinzufügen, funktioniert es einwandfrei. Der Pin-Tropfen, können Sie darauf klicken, seine Legende zu sehen, das Leben ist gut.

Das Problem kommt, wenn ich als eine weitere hinzufügen möchten. Als ich den zweiten hinzufügen, plötzlich die stecknadel nicht richtig gefärbt (dh auf ihrer Größe abhängig, bei dem sie eine bestimmte Farbe geben, aber sie sind beide jetzt die gleichen ...), und was noch wichtiger ist, wenn Sie darauf klicken, um zu sehen, ihre callout, stürzt die App mit exex_bad_access. Ich habe wirklich keine Ahnung, was los ist, vielleicht ich hinzufüge, zu viele Ansichten auf die Karte? Aber es ist nur 9 Pins und die Stifte sich fügen Sie einfach in Ordnung. 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 möchte auch hinzufügen, gibt es in der Regel ein oder zwei Stifte aus der 9, die funktioniert, wenn Sie die Anmerkung klicken ...

Wenn ich von Hand manuell nur zwei Anmerkungen versucht auch im Programm (dh entfernen Sie die Schleife), scheitert es immer noch, und die Farbe ist immer noch falsch ...

Veröffentlicht am 17/08/2009 um 18:49
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
1

Es scheint , dass Ihre Speicherverwaltung der stopsVariable falsch ist. Sie ordnen eine änderbare Array, dann ersetzen , die mit dem Array Rückgabewert -[Bus returnStops], so dass die Freisetzung. Es ist auch nicht klar , was mit los ist bus2- ist -[Bus initWithStop:]eine Rückkehr unterschiedliche Instanz Bus? Es ist nicht üblich , jede Methode zum Senden -init*auf ein bereits initialisierten Objekt. Ich denke , dass Sie wahrscheinlich durch die Speicherverwaltung Konventionen in Cocoa Touch verwechselt werden. Hier ist eine Sammlung von Artikeln und anderen Referenzen auf Cocoa Speicherverwaltung (die das gleiche Tier ist).

Beantwortet am 17/08/2009 um 18:55
quelle vom benutzer

stimmen
0

SO war die Antwort, dass ich hielt das init-Objekt sendet bus1, so wird es verwirrt.

"Hallo David,

Ihr Datenmodell sieht mir abgespritzt. Sie haben nur ein Bus-Objekt, das Sie immer wieder initWithStop senden: an.

Hoffe das hilft.

Viel Glück! "

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

Beantwortet am 17/08/2009 um 20:02
quelle vom benutzer

stimmen
0

Ich würde es nicht ein Speichermanagementproblem nennen - ich gerade würde sagen, Sie Arrayreferenzen falsch verwenden.

Nach der Konstruktion verwenden, um das Array mit NSMutableArray * stoppt = [[NSMutableArray alloc] init], ist der nächste Schritt [stoppt addObject:] hinzugefügt jede stoppen Sie speichern möchten.

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

Beantwortet am 17/08/2009 um 19:34
quelle vom benutzer

stimmen
0

Haben Sie versucht, AddAnnotations statt hinzufügen Annotation verwenden? - (void) addAnnotations: (NSArray *) Anmerkungen. Dies könnte für Sie arbeiten ... aber Blick auf die Antwort oben und weitere Inspektion Sie einige Speicherverwaltung Probleme in Ihrem viewDidLoad haben (obwohl thi ist nicht die Ursache des Problems sein könnte, aber es könnte sein). Zunächst Sie das Array allozieren (Stationen) und dann mit einigen Array in dem Bus Objekt ovveriding es, wird dies ein Leck verursachen. Auch sind Sie dann das Array zu, die den Absturz verursachen könnte, da Sie die Array veröffentlichen, die tatsächlich in dem Bus-Objekt ist w hne einen Referenzzähler, um es erhöht zu haben. Ich bin nicht sicher, was initWithStop tut, aber man könnte ein Leck auch hier bekommen, wenn initWithStop das Objekt behält.

Beantwortet am 17/08/2009 um 18:56
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more