Problem å legge til flere kommentarer å kartlegge

stemmer
1

Ok, så jeg har dette problemet. Hva jeg vil gjøre er å manuelt legge til flere merknader til et kart. Når jeg legger bare én merknad, det fungerer feilfritt. Pinne dråper, kan du klikke på den for å se sin callout, livet er bra.

Problemet kommer når jeg ønsker å legge til mer enn én. Når jeg legger den andre, plutselig pinnen oss ikke er farget riktig (dvs. avhengig av omfanget de bør være en viss farge, men de er nå begge det samme ...), og enda viktigere når du klikker på dem, for å se deres bildeforklaringen, krasjer app med exex_bad_access. Jeg aner ikke hva som er galt, kanskje jeg legger for mange synspunkter på kartet? Men det er bare 9 pins og pinnene selv legge helt fint. Her er min kode ...

    - (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;
}

selv prøvde å fjerne den andre funksjonen, men det gjorde ikke noe.

Takk for hjelpen! PS Jeg bør også legge til, er det vanligvis en eller to pinner ut av 9 som fungerer når du klikker på kommentaren ...

Hvis jeg selv prøve å manuelt bare to merknader for hånd i programmet (dvs. fjerne loop), fortsatt ikke det, og fargen er fortsatt feil ...

Publisert på 17/08/2009 klokken 17:49
kilden bruker
På andre språk...                            


4 svar

stemmer
1

Det kan virke som minnet forvaltning av stopsvariabelen er feil. Du tildele et foranderlig array, deretter erstatte det array med returverdien av -[Bus returnStops], og slipp det. Også det er ikke klart hva som skjer med bus2- ikke -[Bus initWithStop:]returnere en annen forekomst av Bus? Det er ikke vanlig å sende noen metode -init*på et allerede initialisert objekt. Jeg tror at du sannsynligvis blir forvirret av minnehåndtering konvensjoner i Cocoa Touch. Her er en samling av artikler og andre referanser på Cocoa minnehåndtering (som er det samme dyret).

Svarte 17/08/2009 kl. 17:55
kilden bruker

stemmer
0

Så svaret var at jeg fortsatte å sende BUS1 init objekt, så det ble forvirret.

"Hei David,

Din datamodell ser spyles til meg. Du har bare en buss objektet som du gjentatte ganger sender initWithStop: til.

Håper dette hjelper.

Lykke til! "

Takk til dere for hjelpen! Dere har hjulpet meg mye!

Svarte 17/08/2009 kl. 19:02
kilden bruker

stemmer
0

Jeg vil ikke kalle det en minnehåndtering problem - jeg vil bare si at du bruker matrise referanser feil.

Etter konstruere en rekke med NSMutableArray * stopper = [[NSMutableArray Alloc] init], er neste skritt å bruke [stopper addObject:] for å legge til hvert stopp du ønsker å lagre.

Etter det? Det er ikke klart hva du egentlig prøver å gjøre.

Svarte 17/08/2009 kl. 18:34
kilden bruker

stemmer
0

Har du prøvd å bruke AddAnnotations istedenfor legge annotering? - (void) addAnnotations: (NSArray *) merknader. Dette kan fungere for deg ... men ser på svaret ovenfor, og nærmere ettersyn du har noen minnehåndtering problemer i viewDidLoad (selv thi s kan ikke være årsaken til problemet ditt, men det kan være). Først av dere er tildeling av matrisen (stopp), og deretter ovveriding det med noen array i en buss objekt, vil dette føre til en lekkasje. Også du deretter slippe den oppstillingen som kan være årsaken til ulykken siden du slipper array som faktisk er i Bus objektet w ithout har økt en referanse teller til det. Jeg er ikke sikker på hva initWithStop gjør, men du kan få en lekkasje her også hvis initWithStop beholder objektet.

Svarte 17/08/2009 kl. 17:56
kilden bruker

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