Проблема добавление нескольких аннотаций к карте

StackOverflow https://stackoverflow.com/questions/1289405

  •  18-09-2019
  •  | 
  •  

Вопрос

Хорошо, у меня есть эта проблема. Что я хочу сделать, так это вручную добавлять несколько аннотаций на карту. Когда я добавляю только одну аннотацию, это работает безупречно. Булавка падает, вы можете нажать на него, чтобы увидеть его выножку, жизнь хороша.

Проблема возникает, когда я хочу добавить более одного. Когда я добавляю второй, внезапно булавки не окрашены правильно (т.е. в зависимости от их величины, они должны быть определенным цветом, но теперь они оба одинаковы…), и, что более важно, когда вы нажимаете на них, чтобы увидеть их Высота, приложение сбоя с Exex_Bad_Access. Я действительно понятия не имею, что случилось, может быть, я добавляю слишком много просмотров на карту? Но это всего лишь 9 булавок, и сами булавки добавляют просто отлично. Вот мой код ...

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

Даже попытался удалить вторую функцию, но она ничего не сделала.

Спасибо за помощь! PS Я также должен добавить, обычно есть один или два контакта из 9, которые работают, когда вы нажимаете на аннотацию ...

Если я даже попытаюсь вручную только две аннотации вручную в программе (т.е. удалить петлю), он все еще терпит неудачу, и цвет все еще неверен ...

Это было полезно?

Решение 4

Поэтому ответом было то, что я продолжал отправлять Bus1 объект init, поэтому он запутался.

"Привет, Дэвид,

Ваша модель данных выглядит для меня. У вас есть только один автобусный объект, который вы неоднократно отправляете init withstop: to.

Надеюсь это поможет.

Удачи! "

Спасибо, ребята, за вашу помощь! Вы все помогли мне немного!

Другие советы

Похоже, что ваше управление памятью stops переменная неверна. Вы распределяете изменяемый массив, а затем заменяете этот массив на возвращаемое значение -[Bus returnStops], затем выпустите это. Также неясно, что происходит с bus2 - делает -[Bus initWithStop:] вернуть а другой случай Bus? Не обычно отправлять какой -либо метод -init* на уже инициализированном объекте. Я думаю, что вы, вероятно, смущены соглашениями по управлению памятью в Cocoa Touch. Вот коллекция статей и других ссылок по управлению памятью какао (который тот же зверь).

Вы пробовали использовать дополнения вместо добавления аннотации? - (void) дополнения: (nsarray *) аннотации. Это может сработать для вас ... но, глядя на ответ выше и дальнейший осмотр, у вас возникают проблемы с управлением памятью в вашей просмотре (хотя это может не быть причиной вашей проблемы, но это может быть). Во -первых, вы выделяете массив (остановки), а затем выводят его с некоторым массивом в автобусном объекте, это вызовет утечку. Кроме того, вы выпускаете этот массив, который может вызвать сбой, так как вы выпускаете массив, который фактически находится в автобусной объекте, увеличив подсчет ссылок на него. Я не уверен, что делает init withstop, но вы можете получить утечку здесь, если initwithstop сохранит объект.

Я бы не назвал это проблемой по управлению памятью - я бы просто сказал, что вы используете массивные ссылки неправильно.

После построения массива с помощью nsmutablearray *stops = [[nsmutablearray alloc] init], следующим шагом является использование [Stops AddObject:], чтобы добавить каждую остановку, которую вы хотите сохранить.

После того? Не ясно, что вы на самом деле пытаетесь сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top