Question

Ok, donc je vais avoir ce problème. Ce que je veux faire est d'ajouter manuellement plusieurs annotations à une carte. Quand je viens d'ajouter une annotation, il fonctionne parfaitement. La broche tombe, vous pouvez cliquer dessus pour voir sa légende, la vie est bonne.

Le problème vient quand je veux ajouter plus d'un. Quand j'ajoute le second, tout à coup de la broche ne sont pas correctement colorés (c.-à-selon leur importance, ils devraient être une certaine couleur, mais ils sont maintenant à la fois la même ...), et surtout lorsque vous cliquez dessus, pour voir leur callout, l'application se bloque avec exex_bad_access. Je ne sais vraiment pas ce qui ne va pas, peut-être j'ajouter trop de vues à la carte? Mais il est seulement 9 broches et les broches s'ajouter très bien. Voici mon 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;
}

même essayé d'enlever la deuxième fonction, mais il n'a rien fait.

Merci pour l'aide! P.S Je dois aussi ajouter, il y a habituellement une ou deux broches des 9 qui fonctionne lorsque vous cliquez sur l'annotation ...

Si j'essaie même manuellement que deux annotations à la main dans le programme (à savoir, enlever la boucle), il échoue encore et la couleur est encore mal ...

Était-ce utile?

La solution 4

La réponse était que je continuais d'envoyer bus1 l'objet init, il est embrouillé.

"Salut David,

Votre modèle de données semble me aspergé. Vous avez seulement un objet de bus que vous envoyez à plusieurs reprises initWithStop:. À

Hope this helps.

Bonne chance! «

Merci les gars pour votre aide! Vous me aidé un peu!

Autres conseils

Il semblerait que votre gestion de la mémoire de la variable stops est incorrecte. Vous allouez un tableau mutable, puis remplacez ce tableau avec la valeur de retour de -[Bus returnStops], puis relâchez que. il est également pas clair ce qui se passe avec bus2 - ne -[Bus initWithStop:] retourner différent instance de Bus? Ce n'est pas d'habitude d'envoyer toute méthode -init* sur un objet déjà initialisés. Je pense que vous êtes probablement confus par les conventions de gestion de la mémoire dans Cocoa Touch. Voici une collection d'articles et d'autres références sur la gestion de la mémoire Cocoa (ce qui est la même bête).

Avez-vous essayé d'utiliser AddAnnotations au lieu d'ajouter une annotation? - (void) addAnnotations: (NSArray *) annotations. Cela pourrait fonctionner pour vous ... mais en regardant la réponse ci-dessus et l'inspection plus vous rencontrez des problèmes de gestion de la mémoire dans votre viewDidLoad (si thi s pourrait ne pas être la cause de votre problème, mais il pourrait être). D'abord vous allouez le tableau (arrêts) et ovveriding ensuite avec une matrice dans l'objet de bus, cela provoquera une fuite. vous aussi relâchant ensuite ce tableau qui pourrait être à l'origine du crash puisque vous publiez le tableau qui est en fait dans l'objet de bus ayant augmenté S ans un nombre de référence. Je ne suis pas sûr de ce que initWithStop fait, mais vous pourriez être obtenir une fuite ici aussi si initWithStop conserve l'objet.

Je ne parlerais pas d'un problème de gestion de la mémoire - je dirais simplement que vous utilisez des références de tableau incorrectement

.

Après la construction du tableau avec NSMutableArray * arrêts = [[NSMutableArray alloc] init], l'étape suivante consiste à utiliser [arrête addObject:]. Ajouter chaque arrêt vous voulez stocker

Après cela? Il est clair pas ce que vous essayez vraiment de faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top