Отображать ограниченное количество отсортированных аннотаций в Mapview

У меня есть 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];
}

person danskcollignon    schedule 30.12.2010    source источник


Ответы (1)


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

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

person Community    schedule 30.12.2010
comment
Можно ли просто повторить это 10 раз? Как бы Вы это сделали? 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]; [самостоятельная настройкаMapZoom]; [релиз poiAnnotation]; - person danskcollignon; 30.12.2010
comment
Пример: for (NSDictionary *poiDict in YourArray) { code-in-your-comment-here }. Я бы также не стал вызывать AdjustMapZoom внутри цикла. Вы должны вызвать его один раз после цикла for. - person ; 30.12.2010
comment
благодаря. не могли бы вы просмотреть мой новый код... он все еще не работает :( - person danskcollignon; 01.01.2011
comment
Вопросы: (1) Вы подтвердили, что poiArray работает? (2) Где и когда вызывается displayPois? (3) Почему используется nextPoiIndex вместо i? (4) Почему loadAndSortPOIs вызывается в displayPois? (5) Что делает AdjustMapZoom? - person ; 01.01.2011