Отображать ограниченное количество отсортированных аннотаций в MapView - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть NSArray 500 аннотаций, и я в основном хочу показать пользователю только десять ближайших аннотаций (остальные не будут добавлены в Mapview)

Как мне это сделать?

Вот мой код:

-(void) loadAndSortPOIs {
 [poiArray release];
 nextPoiIndex = 0;
 NSString *poiPath = [[NSBundle mainBundle] pathForResource:@"annotations"
              ofType:@"plist"];
 poiArray = [[NSMutableArray alloc] initWithContentsOfFile:poiPath];
 CLLocation *homeLocation = [[CLLocation alloc] 
        initWithLatitude:homeCoordinate.latitude
        longitude:homeCoordinate.longitude];
 for (int i = 0; i < [poiArray count]; i++) {
  NSDictionary *dict = (NSDictionary*) [poiArray objectAtIndex: i];
  CLLocationDegrees storeLatitude = [[dict objectForKey:@"workingCoordinate.latitude"] doubleValue];
  CLLocationDegrees storeLongitude = [[dict objectForKey:@"workingCoordinate.longitude"] doubleValue];
  CLLocation *storeLocation = [[CLLocation alloc]
          initWithLatitude:storeLatitude
          longitude:storeLongitude];
  CLLocationDistance distanceFromHome = [storeLocation distanceFromLocation: homeLocation];
  [storeLocation release];


  NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]
           initWithDictionary:dict];
  [mutableDict setValue:[NSNumber numberWithDouble:distanceFromHome]
        forKey:@"distanceFromHome"];
  [poiArray replaceObjectAtIndex:i withObject:mutableDict];
  [mutableDict release];

 }


// now sort by distanceFromHome

 NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"distanceFromHome" ascending:YES] autorelease]];

 [poiArray sortUsingDescriptors:sortDescriptors];
 NSLog (@"poiArray: %@", poiArray);

 [homeLocation release];

РЕДАКТИРОВАТЬ: я добавил это в свой код, но он все еще не работает ...

- (void) displayPois {
    [mapView removeAnnotations: mapView.annotations];
for(int i = 0; i < 10; i++) {
    NSDictionary *poiDict = [poiArray objectAtIndex:nextPoiIndex++];
    CLLocationCoordinate2D poiCoordinate;
    poiCoordinate.latitude = [[poiDict valueForKey:@"workingCoordinate.latitude"] doubleValue];
    poiCoordinate.longitude = [[poiDict valueForKey:@"workingCoordinate.longitude"] doubleValue];
    MyHomeAnnotation *poiAnnotation = [[MyHomeAnnotation alloc]
                                       initWithCoordinate:poiCoordinate
                                       title:[poiDict valueForKey:@"Subtitle"]
                                       ];
        [mapView addAnnotation:poiAnnotation];
        [self loadAndSortPOIs];
    [poiAnnotation release];

    }   [self adjustMapZoom];
}

1 Ответ

0 голосов
/ 30 декабря 2010

Метод addAnnotations ожидает массив объектов, соответствующих протоколу MKAnnotation. Массив, который вы передаете, кажется, содержит простые словарные объекты.

Вам необходимо заменить строку addAnnotations циклом, который проходит через ваш массив аннотаций и создает объект MKPointAnnotation из каждого объекта словаря (извлеките координаты и инициируйте объект MKPointAnnotation с ними). Затем (внутри цикла for) вызовите addAnnotation (в единственном числе) и передайте ему объект MKPointAnnotation.

...