Несколько аннотаций из NSMutableArray в мапките

У меня есть изменяемый массив, который заполняется из sqlite db в ios. Я получил аннотации для загрузки и просмотра правильно. Мой вопрос в том, как я могу написать цикл, который будет добавлять аннотации с размером массива. Я пробовал следующий код и получаю и отображаю последнюю запись в массиве

NSMutableArray *annotations=[[NSMutableArray alloc] init];
CLLocationCoordinate2D theCoordinate5;
MyAnnotation* myAnnotation5=[[MyAnnotation alloc] init];
for (int i = 0; i < _getDBInfo.count; i++) {

    dbInfo *entity = [_getDBInfo objectAtIndex:i];

    NSNumber *numlat=[[NSNumber alloc] initWithDouble:[entity.Latitude doubleValue]];
    NSNumber *numlon=[[NSNumber alloc] initWithDouble:[entity.Longitude doubleValue]];
    NSLog(@"%d",[_getDBInfo count]);
    la=[numlat doubleValue];
    lo=[numlon doubleValue];
    theCoordinate5.latitude=la;
    theCoordinate5.longitude=lo;

    myAnnotation5.coordinate=theCoordinate5;
    myAnnotation5.title=[NSString stringWithFormat:@"%@"entity.EntityNo];
    myAnnotation5.subtitle=[NSString stringWithFormat:@"%@",entity.EntityName]; 
    [mapView addAnnotation:myAnnotation5];
    [annotations addObject:myAnnotation5];
}

Я предполагаю, что мой вопрос заключается в том, как я могу создавать и добавлять к моему представлению объекты аннотаций на основе количества в моем массиве?

Любая помощь горячо приветствуется.

Я новичок в iOS, а также в программировании, поэтому будьте осторожны.


person charlie johnston    schedule 14.05.2012    source источник
comment
Что такое myAnnotation1? Ожидаете ли вы, что ваш массив annotations будет содержать все объекты аннотаций, которые вы добавляете на карту?   -  person    schedule 14.05.2012
comment
извините, вставил неправильную строку в код, но сейчас он отредактирован. У меня есть 6 объектов в моем массиве, но может быть от 0 до 10. Я пытаюсь получить аннотацию для каждого объекта без необходимости жестко кодировать каждый объектный индекс   -  person charlie johnston    schedule 14.05.2012
comment
PS- Строка «myAnnotation5.title=[NSString stringWithFormat:@%@entity.EntityNo]» не должна даже компилироваться без запятой (добавлено в мой ответ). Убедитесь, что задавая вопрос, вы копируете и вставляете ТОЧНЫЙ код.   -  person Conrad Shultz    schedule 14.05.2012


Ответы (2)


У вас есть только один объект myAnnotation5. Когда вы устанавливаете его coordinate, title и т. д., вы устанавливаете его для этого экземпляра, который вы добавили к annotations несколько раз. Следовательно, каждая запись в annotations будет иметь последний установленный вами набор свойств, поскольку каждая запись в annotations на самом деле является одним и тем же объектом.

Чтобы исправить это, вам нужно создавать свой объект myAnnotation5 заново на каждой итерации цикла, т.е.

for (int i = 0; i < _getDBInfo.count; i++) {
    MyAnnotation* myAnnotation5=[[MyAnnotation alloc] init];
    ...
    myAnnotation5.coordinate=theCoordinate5;
    myAnnotation5.title=[NSString stringWithFormat:@"%@", entity.EntityNo];
    myAnnotation5.subtitle=[NSString stringWithFormat:@"%@", entity.EntityName];
    ...
    [mapView addAnnotation:myAnnotation5];
}

Два отступления:

  1. Я надеюсь, что вы строите с ARC, иначе вы теряете память налево и направо.
  2. Поскольку MKMapView имеет свойство -annotations, у вас, вероятно, нет особых причин хранить собственный массив annotations — просто сохраните ссылку на mapView.
person Conrad Shultz    schedule 14.05.2012
comment
Спасибо за помощь, все сработало с первой попытки, и да, я использую ARC. - person charlie johnston; 14.05.2012
comment
@charliejohnston Рад быть полезным. - person Conrad Shultz; 14.05.2012
comment
@ConradShultz У меня похожая проблема, можно ли помочь мне с моим кодом? Я хочу использовать жест, чтобы добавить аннотацию булавки на мой mapView. У меня есть код, но я не знаю, где его использовать... - person Simagen; 28.08.2012
comment
@cameron Пожалуйста, задайте свой вопрос отдельно. - person Conrad Shultz; 29.08.2012
comment
@ConradShultz stackoverflow.com/questions /12180298/ - person Simagen; 29.08.2012

Переместите эту строку:

MyAnnotation* myAnnotation5=[[MyAnnotation alloc] init];

внутри цикла for непосредственно перед установкой свойств myAnnotation5.

Сейчас вы создаете только один объект MyAnnotation и неоднократно изменяете его свойства.

person Community    schedule 14.05.2012
comment
Пожалуйста, взгляните и на этот вопрос: stackoverflow.com/questions/30396754/ - person iYoung; 23.05.2015
comment
@ Анна, пожалуйста, помогите мне с этим stackoverflow.com /вопросы/36330331/ - person Bhavin Ramani; 31.03.2016