Несколько аннотаций не отображаются (Xcode mapview) - PullRequest
1 голос
/ 19 января 2012
[super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

NSArray *name = [NSArray arrayWithObjects:@"Marina Bay Sands", @"Sentosa", @"Singapore Polytechnic",nil];
NSArray *description = [NSArray arrayWithObjects:@"Got casino!!", @"Got Universal Studio Singapore!!", @"Best polytechnic in Singapore!",nil];    

self.mapAnnotations = [[NSMutableArray alloc] initWithCapacity:3];

//Set coordinates for pin
CLLocationCoordinate2D location;
location.latitude = (double)1.2822463547298561;
location.longitude = (double) 103.85830879211426;
MapPin *mapPin = [[MapPin alloc] init];
[mapPin setCoordinate:location];
[mapPin setName: [name objectAtIndex:0]];
[mapPin setDescription:[description objectAtIndex:0]];
[self.mapAnnotations addObject:mapPin];

location.latitude = (double) 1.249404;
location.longitude = (double) 103.830321;
[mapPin setCoordinate:location];
[mapPin setName: [name objectAtIndex:1]];
[mapPin setDescription:[description objectAtIndex:1]];
[self.mapAnnotations addObject:mapPin];

location.latitude = (double) 1.309976;
location.longitude = (double) 103.775921;
[mapPin setCoordinate:location];
[mapPin setName: [name objectAtIndex:2]];
[mapPin setDescription:[description objectAtIndex:2]];
[self.mapAnnotations addObject:mapPin];

[self.mapView addAnnotations:self.mapAnnotations];

self.mapView.mapType = MKMapTypeStandard;
[self location];
mapView.showsUserLocation = YES;

Привет, довольно новый для программирования XCode, и это мои коды в viewDidLoad. Я пытаюсь показать несколько аннотаций, и это просто попробовать. Но из этого кода я могу показать только 1 аннотацию, и это последний объект, который я добавил в массив mapAnnotations .

Единственный способ заставить его работать - это инициализировать mapPin1 и mapPin2 вместо использования mapPin для всех, для двух других аннотаций, которые Я хочу создать. Но в этом случае он кажется очень неэффективным (поправьте меня, если я ошибаюсь), и, кроме того, у меня есть сотни данных, которые можно добавить. Невозможно жестко их кодировать.

Может ли кто-нибудь помочь мне с этим?

Спасибо =)

Ответы [ 4 ]

4 голосов
/ 19 января 2012

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

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

NSArray *name = [NSArray arrayWithObjects:@"Marina Bay Sands", @"Sentosa", @"Singapore 
    Polytechnic",nil];
NSArray *description = [NSArray arrayWithObjects:@"Got casino!!", @"Got Universal Studio 
    Singapore!!", @"Best polytechnic in Singapore!",nil];    

self.mapAnnotations = [[NSMutableArray alloc] initWithCapacity:3];

//here you create the properties of the pin the first time
CLLocationCoordinate2D location;
location.latitude = (double)1.2822463547298561;
location.longitude = (double) 103.85830879211426;

//here you create the pin
MapPin *mapPin = [[MapPin alloc] init];

//now you set its properties
[mapPin setCoordinate:location];
[mapPin setName: [name objectAtIndex:0]];
[mapPin setDescription:[description objectAtIndex:0]];
//now you add it to the array
[self.mapAnnotations addObject:mapPin];

//now you are changing the properties of `mapPin`
location.latitude = (double) 1.249404;
location.longitude = (double) 103.830321;
[mapPin setCoordinate:location];
[mapPin setName: [name objectAtIndex:1]];
[mapPin setDescription:[description objectAtIndex:1]];

//the problem with adding mapPin again here is that you are adding
//the same object again, just with different properties, so
//your array still only has one object in it, `mapPin`, but with its updated properties
[self.mapAnnotations addObject:mapPin];

//you change the properties again here
location.latitude = (double) 1.309976;
location.longitude = (double) 103.775921;
[mapPin setCoordinate:location];
[mapPin setName: [name objectAtIndex:2]];
[mapPin setDescription:[description objectAtIndex:2]];

//and the same phenomenon I previously described happens again here
[self.mapAnnotations addObject:mapPin];

[self.mapView addAnnotations:self.mapAnnotations];

self.mapView.mapType = MKMapTypeStandard;
[self location];
mapView.showsUserLocation = YES;

Если вы не хотите создавать новые mapPins каждый раз, когда добавляете их вмассив, попробуйте это каждый раз, когда вы добавляете пин-код в массив:

вместо

[self.mapAnnotations addObject:mapPin];

try

[self.mapAnnotations addObject:[[mapPin copy] autorelease]];

Это добавит копию вашего измененногоmapPin вместо того, чтобы указывать на то же место в памяти, где находится исходный.

3 голосов
/ 19 января 2012

Вы создаете один mapPin и неоднократно добавляете один и тот же объект.Вам нужно alloc/init новый объект аннотации для каждой аннотации, которую вы хотите добавить на карту.

0 голосов
/ 14 декабря 2012

возьмите всю длину лата в массиве и используйте приведенный ниже код

for (int i = 0; i < [arrListing count]; i++) {


            List *obj = [arrList objectAtIndex:i];
            NSLog(@"Title %@  long:%@  Lat:%@",obj.Title,obj.log,obj.lat);

            CLLocationCoordinate2D annotationCoord;

            annotationCoord.latitude = [obj.lat floatValue];
            annotationCoord.longitude = [obj.log floatValue];

            MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init];
            annotationPoint.coordinate = annotationCoord;
            annotationPoint.title = obj.Title;
            annotationPoint.subtitle = obj.log;
            [mapView addAnnotation:annotationPoint];
        }
0 голосов
/ 19 января 2012

Для подсказки попробуйте

int howManyAreThere = [self.mapAnnotations count];

после 3 добавлений и точки останова, чтобы увидеть, что на самом деле происходит.

Хотя NSMutableArray обрабатывает дубликаты, он не копирует объект, который вы передаете. Это умнее, чем .

...