2013-09-03 3 views
1

В первый раз, когда загружается диспетчер просмотра, я загружаю данные из веб-службы, а затем использую детали для добавления аннотаций. Когда я нажимаю кнопку, чтобы снова загружать данные и помещать их снова, неправильно фотографии каждый раз. Я попытался очистить кеш, и это не помогает, я пробовал много способов. Любые идеи?Обновление комментариев аннотаций

EDIT:

- (void)addCustomersToMap 
{ 
    marker = nil; 
    profilePics = [[NSMutableArray alloc] init]; 

    if ([self.usersNearMe isKindOfClass:[NSDictionary class]]) 
    { 
     NSDictionary *singleUser = (NSDictionary*)self.usersNearMe; 
     self.usersNearMe = [[NSArray alloc] initWithObjects:singleUser, nil]; 
    } 
    if ([self.usersNearMe isKindOfClass:[NSArray class]]) 
    { 
     for (int i = 0; i < self.usersNearMe.count; i++) 
     { 
      NSDictionary *dict = self.usersNearMe[i]; 
      float lat = [[dict objectForKey:@"Lat"] floatValue]; 
      float lon = [[dict objectForKey:@"Lon"] floatValue]; 
      NSString *name = [dict objectForKey:@"Name"]; 
      NSString *time = [dict objectForKey:@"Time"]; 
      NSString *picUrl = [dict objectForKey:@"PictureUrl"]; 
      [profilePics addObject:picUrl]; 
      CLLocationCoordinate2D mLoc = CLLocationCoordinate2DMake(lat, lon); 


      if ([picUrl isEqualToString:@"empty"]) 
      { 
       marker = [[CustomerMarker alloc] initWithLocation:mLoc title:name andSubtitle:time andUrlString:nil andImagePerson:[UIImage imageNamed:@"user"]]; 
      } 
      else if ([picUrl isEqualToString:@"system"]) 
      { 
       marker = [[CustomerMarker alloc] initWithLocation:mLoc title:name andSubtitle:time andUrlString:nil andImagePerson:[UIImage imageNamed:@"police_icon"]]; 
      } 
      else 
      { 
       NSString *completeURL = @""; 
       completeURL = [completeURL stringByAppendingString:kPROFILE_IMAGE_URL]; 
       completeURL = [completeURL stringByAppendingString:@"/2/"]; 
       completeURL = [completeURL stringByAppendingString:picUrl]; 
       completeURL = [completeURL stringByAppendingString:@".png"]; 


       NSURL *url = [NSURL URLWithString:completeURL]; 
       NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
       [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) { 
        if (responseData) { 
         NSString *imageName = completeURL.lastPathComponent; 
         NSString *imagePath = [[self documentsDirectoryPath] stringByAppendingString:imageName]; 
         NSLog(@"imagePath: %@", imagePath); 
         [responseData writeToFile:imagePath atomically:YES]; 
         marker = [[CustomerMarker alloc] initWithLocation:mLoc title:name andSubtitle:time andUrlString:nil andImagePerson:[UIImage imageWithContentsOfFile:imagePath]]; 

         dispatch_async(dispatch_get_main_queue(), ^{ 
          [self.btnRefreshUsers setImage:[UIImage imageWithContentsOfFile:imagePath] forState:UIControlStateNormal]; 
          [self.mapView viewForAnnotation:marker]; 
          [self.mapView addAnnotation:marker]; 
         }); 
        } 
       }]; 
      } 
     } 
    } 

    self.btnRefreshUsers.userInteractionEnabled = YES; 
} 



- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if ([annotation isKindOfClass:[MKUserLocation class]]) 
     { 
      [self.mapView selectAnnotation:((MKUserLocation*) annotation) animated:YES]; 
     } 
    }); 

    if ([annotation isKindOfClass:[MKUserLocation class]]) 
    { 
     ((MKUserLocation*) annotation).title = NSLocalizedString(@"current_location", nil); 
     return nil; 
    } 

    if ([annotation isKindOfClass:[CustomerMarker class]]) 
    { 
     MKAnnotationView *pinView = nil; 
     static NSString *customerMarkerPinID = @"com.idm.customer"; 
     pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:customerMarkerPinID]; 

     if (!pinView) 
     { 
      pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:customerMarkerPinID]; 
     } 

     pinView.canShowCallout = YES; 
     pinView.backgroundColor = [UIColor clearColor]; 


     CustomerMarker *customerMarker = (CustomerMarker*)annotation; 
     pinView.image = customerMarker.imagePerson; 

     CGRect pinViewFrame = CGRectZero; 
     pinViewFrame.origin.x = pinView.frame.origin.x; 
     pinViewFrame.origin.y = pinView.frame.origin.y; 
     pinViewFrame.size.width = 40.0f; 
     pinViewFrame.size.height = 40.0f; 
     pinView.frame = pinViewFrame; 


     ////////// Animate Pin Drop ////////// 

     CGRect endFrame = pinView.frame; 
     pinView.frame = CGRectOffset(pinView.frame, 0, -230); 

     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:0.45f]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

     pinView.frame = endFrame; 

     [UIView commitAnimations]; 

     /* CGRect endFrame = pinView.frame; 
     pinView.frame = CGRectOffset(pinView.frame, 0, -230); 
     [UIView animateWithDuration:0.45f delay:0 options:UIViewAnimationOptionShowHideTransitionViews animations:^{ 
      [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
     } completion:^(BOOL finished) { 
      if (finished) { 
       pinView.frame = endFrame; 
      } 
     }]; */ 

     return pinView; 
    } 

    return nil; 
} 

ответ

2

Есть две основные проблемы здесь. Сначала вы повторно используете pinView, но не устанавливаете атрибуты в соответствии с аннотацией, которую он пытается рисовать. Вы правы, чтобы удалить переопределяемый аннотационный просмотр, но если вы его повторно используете, или вам не обязательно будет устанавливать изображение на тот, который вы хотите нарисовать прямо сейчас, иначе образ pinView будет тем, который был ранее. например

if ([annotation isKindOfClass:[CustomerMarker class]]) 
{ 
    MKAnnotationView *pinView = nil;//Create a new handle, don't risk having one global one 
    static NSString *customerMarkerPinID = @"com.idm.customer"; 
    pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:customerMarkerPinID]; 

    if (!pinView) 
    { 
     pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:customerMarkerPinID]; 

     //Since all your pinViews can show callouts you only need to set this 
     //when creating a new one, not when reusing an existing one which will 
     // already have it set 
     pinView.canShowCallout = YES; 
    } 
     pinView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"map_pic"]]; 

    ... 

    return pinView; 
} 

//[self.mapView setNeedsDisplay]; <--- Don't do this 
return nil; 

Во-вторых вы выбираете изображение для каждого контакта на основе profilePicsCounter, который изменяется в то время как вы добавляете изображения, но и MAPview может и попросить мнения в любом порядке, он чувствует, как не в если вы их добавите. Поэтому вам нужно ответить на viewForAnnotation, вычислив представление, основанное на аннотации, которую он вам дает. Это ключ от имени. Эта линия:

NSString *urlString = profilePics[profilePicsCounter]; 

должно быть что-то вроде

MyAnnotationClass *myAnno = (MyAnnotationClass)annotation 
NSString *urlString = myAnno.urlString; 

По сути вы должны хранить информацию, необходимую в аннотации.

Кроме того, аннотации часть removeAllMarkers функции может быть сокращена до одной линии

[self.mapView removeAnnotations:self.mapView.annotations]; 

И вы устанавливаете BackgroundColor на вашем pinViews дважды

+0

Спасибо за вашу помощь, так как быстрее, так как я проверю он с несколькими комментариями, я буду отмечать ваш ответ как правильный, прямо сейчас у меня всего 1 человек в качестве аннотации. –

+0

ОК, фотографии все еще путаются. –

+1

@IdanMoshe: Как уже было сказано в ответе: «вы повторно используете pinView, но не устанавливаете атрибуты в соответствии с аннотацией, которую пытается рисовать ...». Обновленный код по-прежнему устанавливает только изображение аннотации при создании нового представления, но не при повторном использовании. Он должен установить изображение независимо (потому что изображение основано на _current_ «аннотация»). – Anna

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