Problemă adăugarea mai multor adnotări la hartă

voturi
1

Ok, deci am avut această problemă. Ceea ce vreau să fac este manual, adăugați mai multe adnotări la o hartă. Când adaug doar o adnotare, funcționează impecabil. Picăturile PIN, puteți face clic pe ea pentru a vedea înștiințărilor sale, viața este bună.

Problema vine atunci când vreau să adăugați mai mult de unul. Când am adăuga a doua, dintr-o dată PIN-ul nu sunt colorate în mod corect (de exemplu, în funcție de mărimea lor, acestea ar trebui să fie o anumită culoare, dar acestea sunt acum atât la fel ...), și mai important, atunci când faceți clic pe ele, pentru a vedea lor înștiințărilor, aplicația se blochează cu exex_bad_access. Eu chiar am nici o idee despre ce sa întâmplat, poate că eu sunt adăugarea de prea multe puncte de vedere pe hartă? Dar este numai 9 pini și pinii se adaugă foarte bine. Iată codul meu ...

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

chiar a încercat eliminarea a doua funcție, dar nu a făcut nimic.

Multumesc pentru ajutor! PS Ar trebui, de asemenea, adăuga, există, de obicei, unul sau doi pini din cele 9 care funcționează atunci când faceți clic pe adnotarea ...

În cazul în care chiar și eu încerc să manual doar două adnotări de mână în program (de exemplu, elimina bucla), încă nu reușește, iar culoarea este încă greșită ...

Întrebat 17/08/2009 la 18:49
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
1

Se pare că gestionarea de memorie a stopsvariabilei este incorectă. Alocați o matrice mutabil, apoi înlocuiți că matrice cu valoarea returnată -[Bus returnStops], apoi eliberați asta. De asemenea , nu este clar ce se întâmplă cu bus2- se -[Bus initWithStop:]întoarce o altă instanță a Bus? Nu e de obicei pentru a trimite orice metodă -init*pe un obiect deja-inițializată. Cred că , probabil , sunt confundate de convențiile de gestionare a memoriei în Cocoa Touch. Iată o colecție de articole și alte referințe privind managementul memoriei de cacao (care este aceeași fiară).

Publicat 17/08/2009 la 18:55
sursa de către utilizator

voturi
0

Deci, răspunsul a fost că am păstrat trimiterea bus1 obiectul de inițializare, așa că am confundat.

"Buna David,

Modelul dvs. de date arata hosed pentru mine. Ai doar un singur obiect de autobuz pe care îl trimit în mod repetat initWithStop: a.

Sper că acest lucru vă ajută.

Mult noroc! "

Vă mulțumesc baieti pentru ajutor! Voi toți m-au ajutat destul de un pic!

Publicat 17/08/2009 la 20:02
sursa de către utilizator

voturi
0

Nu aș numi-o problemă de management al memoriei - Aș spune doar când utilizați referințe matrice incorect.

După construirea matrice cu NSMutableArray * oprește = [[NSMutableArray aloc] init], următorul pas este de a utiliza [oprește addObject:] pentru a adăuga fiecare oprire pe care doriți să stocați.

Dupa aceea? Nu este clar ceea ce cu adevărat încerci să faci.

Publicat 17/08/2009 la 19:34
sursa de către utilizator

voturi
0

Ați încercat să utilizați AddAnnotations în loc de a adăuga adnotare? - (void) addAnnotations: (NSArray *) adnotări. Acest lucru ar putea lucra pentru tine ... dar uita la răspunsul de mai sus și în continuare de inspecție aveți unele probleme de memorie Managment în viewDidLoad dumneavoastră (deși s-ar putea să nu Thi fi cauza problemei tale, dar ar putea fi). Mai întâi vi se alocă matrice (opriri) și apoi ovveriding-l cu unele matrice în obiectul Bus, acest lucru va duce la o scurgere. De asemenea, vă sunt apoi eliberarea ca matrice care ar putea fi cauza prăbușirii din moment ce eliberați matrice, care este, de fapt, în obiectul de autobuz w ără care au crescut un număr de referință la acesta. Nu sunt sigur ce face initWithStop, dar s-ar putea fi obtinerea unei scurgeri de aici, dacă initWithStop reține obiectul.

Publicat 17/08/2009 la 18:56
sursa de către utilizator

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