Проблема добавление нескольких аннотаций к карте
-
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:], чтобы добавить каждую остановку, которую вы хотите сохранить.
После того? Не ясно, что вы на самом деле пытаетесь сделать.