В первый раз, когда загружается диспетчер просмотра, я загружаю данные из веб-службы, а затем использую детали для добавления аннотаций. Когда я нажимаю кнопку, чтобы снова загружать данные и помещать их снова, неправильно фотографии каждый раз. Я попытался очистить кеш, и это не помогает, я пробовал много способов. Любые идеи?Обновление комментариев аннотаций
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;
}
Спасибо за вашу помощь, так как быстрее, так как я проверю он с несколькими комментариями, я буду отмечать ваш ответ как правильный, прямо сейчас у меня всего 1 человек в качестве аннотации. –
ОК, фотографии все еще путаются. –
@IdanMoshe: Как уже было сказано в ответе: «вы повторно используете pinView, но не устанавливаете атрибуты в соответствии с аннотацией, которую пытается рисовать ...». Обновленный код по-прежнему устанавливает только изображение аннотации при создании нового представления, но не при повторном использовании. Он должен установить изображение независимо (потому что изображение основано на _current_ «аннотация»). – Anna