我遇到的问题是,当我单击PIN时,它给出了与同一PIN相关的错误信息。我认为PIN的索引可能与数组的索引不同。
这是代码:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
MKAnnotationView *pinView = nil;
if(annotation != mapView.userLocation)
{
static NSString *defaultPinID = @"com.invasivecode.pin";
pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
if ( pinView == nil )
pinView = [[MKAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:defaultPinID];
pinView.canShowCallout = YES;
if ((annotation.coordinate.latitude == mapLatitude) && (annotation.coordinate.longitude == mapLongitude)) {
if ([estadoUser isEqualToString:@"online"])
{
// NSLog(@"ONLINE");
pinView.image = [UIImage imageNamed:@"1352472516_speech_bubble_green.png"]; //as suggested by Squatch
}else{
//NSLog(@"OFFLINE");
pinView.image = [UIImage imageNamed:@"1352472468_speech_bubble_red.png"];
}
}
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(showDetails)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;
} else {
[mapView.userLocation setTitle:@"I am here"];
}
return pinView;
}
-(void)showDetails
{
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
DMChatRoomViewController *_controller = [storyboard instantiateViewControllerWithIdentifier:@"DmChat"];
[self presentViewController:_controller animated:YES completion:nil];
}
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
if ([view.annotation isKindOfClass:[DisplayMap class]])
{
NSInteger index = [mapView.annotations indexOfObject:view.annotation]
DisplayMap *annotation = (DisplayMap *)view.annotation;
NSMutableDictionary *item = [allMapUsers objectAtIndex:index];
//HERE DOES NOT DISPLAY THE INFO ON THE CORRECT PLACE
NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults];
[standardUserDefaults setObject:[[allMapUsers objectAtIndex:index] objectId] forKey:@"userSelecionadoParaChat"];
[standardUserDefaults synchronize];
}
}
-(void)reloadMap
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
for (int i=0; i<allMapUsers.count; i++)
{
NSMutableDictionary *item = [allMapUsers objectAtIndex:i];
NSLog(@"index=%i para objectID=%@",i,[[allMapUsers objectAtIndex:i] objectId]);
if (([[item valueForKey:@"estado"] isEqualToString:@"offline"] && [[defaults stringForKey:@"showOfflineUsers"] isEqualToString:@"no"]) || [[item valueForKey:@"estado"] isEqualToString:@""]) {
}else{
estadoUser = [item valueForKey:@"estado"];
[outletMapView setMapType:MKMapTypeStandard];
[outletMapView setZoomEnabled:YES];
[outletMapView setScrollEnabled:YES];
MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
region.center.latitude = [[item valueForKey:@"Latitude"] floatValue];
region.center.longitude = [[item valueForKey:@"Longitude"] floatValue];
region.span.longitudeDelta = 81;
region.span.latitudeDelta = 80;
[outletMapView setRegion:region animated:YES];
/////
mapLatitude = [[item valueForKey:@"Latitude"] floatValue];
mapLongitude = [[item valueForKey:@"Longitude"] floatValue];
CLLocationCoordinate2D locationco = {mapLatitude,mapLongitude};
ann = [[DisplayMap alloc] init];
ann.coordinate = locationco;
ann.title = [item valueForKey:@"username1"];
NSLog(@"ann.title=%@ para objectID=%@",[item valueForKey:@"username1"],[[allMapUsers objectAtIndex:i] objectId]);
ann.subtitle = [item valueForKey:@"estado"];
ann.coordinate = region.center;
[outletMapView addAnnotation:ann];
}
}
}
对不起,我的英语不好,如果您不明白这个问题,请不要下降,只是问,我总是在回答。
最好的问候
在didSelectAnnotationView
中,此代码:
NSInteger index = [mapView.annotations indexOfObject:view.annotation]
DisplayMap *annotation = (DisplayMap *)view.annotation;
NSMutableDictionary *item = [allMapUsers objectAtIndex:index];
不一定总是有效,因为地图视图的annotations
数组在中无法保证以与添加它们相同的顺序进行注释。(请参阅MKMAPVIEW注释更改/丢失订单?以及如何重新排序MKMAPVIEW注释数组以获取有关此一点的详细信息。)
you 根本不能假设 mapView.annotations
数组中的注释的 index
是 allMapUsers
array中注释源数据的索引。
相反,您可以做的是对注释本身中的源对象进行引用。
例如,将NSMutableDictionary
属性添加到您的DisplayMap
类:
@property (nonatomic, retain) NSMutableDictionary *sourceDictionary;
创建注释时,设置属性:
ann = [[DisplayMap alloc] init];
ann.sourceDictionary = item; // <-- keep ref to source item
ann.coordinate = locationco;
然后在didSelectAnnotationView
中:
DisplayMap *annotation = (DisplayMap *)view.annotation;
NSMutableDictionary *item = annotation.sourceDictionary;
viewForAnnotation
中的另一个可能的问题:
pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotation...
if ( pinView == nil )
pinView = [[MKAnnotationView alloc] ...
pinView.canShowCallout = YES;
如果Dequeue返回以前使用的视图,则其annotation
属性仍将指向以前使用的注释。使用脱水视图时,您必须将其annotation
属性更新为当前注释:
pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotation...
if ( pinView == nil )
pinView = [[MKAnnotationView alloc] ...
else
pinView.annotation = annotation; // <-- add this
pinView.canShowCallout = YES;
有关更多详细信息,请参见MKMAPVIEW OFF屏幕注释图像不正确。