2013-09-22 4 views
2

У меня большие проблемы с выяснением того, что я делаю не так здесь ... Я добавляю аннотации к моим схемам просмотра через циклы, но изображение аннотации абсолютно случайное каждый раз ... когда я NSLog заказ, он случайный - я не уверен, что это проблема.mapview случайное изображение аннотации

- (MKAnnotationView *)mapView:(MKMapView *)mapView1 viewForAnnotation:(id<MKAnnotation>)annotation { 

    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 

    if ([[annotation subtitle] isEqual:@"Bar"]) { 

     MKAnnotationView *view = nil; 

     view = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"myAnnotationIdentifier"]; 
     if (!view) { 
      // Could not reuse a view ... 

      // Creating a new annotation view 
      view = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotationIdentifier"]; 


      view.enabled = YES; 
      view.canShowCallout = YES; 
      view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      view.image = [UIImage imageNamed:@"beer.png"]; 
     } 

     return view; 
    } 
    else if ([[annotation subtitle] isEqual:@"Club"]) { 

     MKAnnotationView *view = nil; 

     view = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"myAnnotationIdentifier"]; 
     if (!view) { 
      // Could not reuse a view ... 

      // Creating a new annotation view 
      view = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotationIdentifier"]; 


      view.enabled = YES; 
      view.canShowCallout = YES; 
      view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      view.image = [UIImage imageNamed:@"clubs.png"]; 
     } 

     return view; 
    } 
} 

view.image совершенно случайным образом ... либо clubs.png или beer.png .. Как сделать это правильно?

это, как я добавить аннотации:

- (void)barLoop { 

    for (int i = 0; i<barArray.count; i++) { 

     int index = [[barArray objectAtIndex:i]intValue]; 

     NSString *lati = [[[self.usersLocationArray objectAtIndex:index] 
          valueForKeyPath:@"items.Latitude"]componentsJoinedByString:@""]; 
     NSString *longi = [[[self.usersLocationArray objectAtIndex:index] 
          valueForKeyPath:@"items.Longitude"]componentsJoinedByString:@""]; 
     NSString *barNavn = [[[self.usersLocationArray objectAtIndex:index] valueForKeyPath:@"items.Navn"]componentsJoinedByString:@""]; 


     float latitude = [lati floatValue]; 
     float longitude = [longi floatValue]; 

     MKCoordinateRegion region = { {0.0, 0.0} , {0.0, 0.0} }; 
     region.center.latitude = latitude; 
     region.center.longitude = longitude; 
     region.span.longitudeDelta = 0.20f; 
     region.span.latitudeDelta = 0.20f; 
     [mapView setRegion:region animated:NO]; 

     CLLocationCoordinate2D location; 
     location.latitude = latitude; 
     location.longitude = longitude; 
     Annotation *ann = [[Annotation alloc]initWithPosition:location]; 
     ann.title = barNavn; 
     ann.subtitle = @"Bar"; 
     [self.mapView addAnnotation:ann]; 
    } 
} 

заранее спасибо :)

ответ

3

У вас есть два типа аннотации, но вы устанавливаете только изображение, когда аннотация изначально создаются. Таким образом, если аннотация для бара прокручивается с экрана карты, а другая аннотация для прокрутки клуба, она может повторно использовать аннотацию просмотра бара для клуба.

Есть два способа крепления этого:

  1. Используйте различные reuseIdentifier параметры для каждого из двух типов представлений аннотаций; или

  2. Установите/сбросьте аннотацию image, независимо от того, удалось ли вернуть ваш вызов dequeueReusableAnnotationViewWithIdentifier или нет.


Unrelated, но ваш метод viewForAnnotation должен:

  1. Вы можете использовать isEqualToString вместо isEqual при проверке @"Bar" против @"Club".

  2. Убедитесь вернуть nil если ни один из этих пунктов if возвращает истину (это никогда не должно произойти, но тем не менее у вас есть потенциальный путь в этой процедуре, в которой вы пренебрегаете вернуть любое значение). Я бы предположил, что это было бы доведено до вашего сведения, если вы запустили код через статический анализатор («Анализировать» в меню «Продукт» Xcode).

  3. Более тонкое наблюдение, но я, вероятно, не полагаться на аннотацию-х subtitle для определения того, какая аннотация вида на работу, а также

    • два аннотаций подклассов, один для баров и один для клубы; или

    • У вас есть обычное свойство в вашем существующем классе Annotation, который указывает, является ли это баром или клубом (и я бы, вероятно, использовал для этого enum).

    В какой-то дату в будущем, вы можете использовать субтитры выноски для чего-то другого, чем «Bar» против «клуба» (например, может быть адрес бара/клуба?), И текущая модель кажется для слияния атрибута пользовательского интерфейса (т.е.е. что отображается в выноске) с свойством состояния (т. е. переменной, которая управляет типом вида аннотации). Не большая вещь, а просто предложение.

+0

спасибо большое! использование другого reuseIdentifier решило мою проблему :) Я собираюсь попробовать свою удачу с предложением определить, что это клуб или бар - имеет смысл иметь адрес бара/клуба. Огромное спасибо! –

Смежные вопросы