我使用plist文件存储字典中包含Name,Address,Coordinates和Icon(pin图像名称)字符串的注释数据。我需要在地图上用pin图像显示我的注释,具体取决于plist中的Icon字符串。我循环我的注释字典,但它显示在我所有引脚上的第一个字典的地图引脚图像上。
我的代码:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
for(path in dict){
NSString *theCategory;
theCategory = [NSString stringWithFormat:@"%@", path];
NSLog(@"%@", path);
NSArray *anns = [dict objectForKey:theCategory];
pinView.image = [UIImage imageNamed:[[anns objectAtIndex:0] objectForKey:@"Icon"]];
}
pinView.canShowCallout=YES;
return pinView;
}
我的plist文件构造:
它向我展示的内容:
答案 0 :(得分:0)
将为添加的每个注释调用viewForAnnotation
委托方法。
您在该方法中使用的for循环将以相同的方式为每个注释运行。所有for循环结束(每次对每个注释)都将pinView.image
设置为for循环读取的最后一项。这恰好是plist中第一个字典中的第一个项目。
您需要将pinView.image
设置为<{>> 当前 注释Icon
的项目的viewForAnnotation
被调用(即传递的annotation
参数)。所以你可以保持for循环并检查项是否与annotation
匹配,然后再设置pinView.image
(然后从for循环中设置break
)
但是,在该委托方法中不断重新阅读并循环使用plist并不是一个好主意。最好使Icon
成为注释类的属性,在创建注释时设置属性(您可能首先在plist中循环创建注释),然后只需在viewForAnnotation
委托方法中直接从注释对象本身使用该属性。
假设您有一些自定义注释类,请将Icon添加为属性:
@interface MyAnnotationClass : NSObject<MKAnnotation>
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@property (nonatomic, copy) NSString *icon; //<---and @synthesize it in .m
然后在循环通过plist创建注释的位置,设置icon
属性就像设置title
属性一样:
ann.title = [item objectForKey:@"Name"];
ann.icon = [item objectForKey:@"Icon"];
最后,在viewForAnnotation
中,您可以直接从icon
阅读annotation
属性。但首先,您应该检查annotation
是否属于您的自定义类类型(因此用户位置蓝点不会受到影响,并且相当确定annotation
将拥有您要访问的属性):
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if (![annotation isKindOfClass:[MyAnnotationClass class]])
{
// Note "!" sign in front of above condition.
// Return nil (default view) if annotation is
// anything but your custom class.
return nil;
}
static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKAnnotationView *pinView = [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
// Create an MKAnnotationView instead of MKPinAnnotationView
// because we are setting a custom image.
// Using MKPinAnnotationView sometimes overrides custom image
// with the built-in pin view.
if (pinView == nil)
{
pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
pinView.canShowCallout = YES;
}
else
pinView.annotation = annotation;
MyAnnotationClass *myAnn = (MyAnnotationClass *)annotation;
pinView.image = [UIImage imageNamed:myAnn.icon];
// May want to check if myAnn.icon is blank (length == 0)
// (OR if pinView.image is still nil after setting)
// and show some default image in that case otherwise
// annotation will be invisible.
return pinView;
}
顺便说一句,在您的plist文件中,Test3
没有Icon
设置。