我创建了以下方法来确定地图视图中我的注释的视图。
- (MKAnnotationView *)mapView:(MKMapView *)mv viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
{
return nil;
}
MKPinAnnotationView *pin;
if ([annotation isKindOfClass:[AnnotationsWithIndices class]])
{
int i = [(AnnotationsWithIndices *)annotation index];
if (i > currentCheckpointIndex )
{
pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"unvisited"];
if (!pin)
{
pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"unvisited"];
}
[pin setPinColor:MKPinAnnotationColorRed];
}
if (i == currentCheckpointIndex)
{
pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"current"];
if (!pin)
{
pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"current"];
}
[pin setPinColor:MKPinAnnotationColorGreen];
}
if (i < currentCheckpointIndex)
{
pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"visited"];
if (!pin)
{
pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"visited"];
}
[pin setPinColor:MKPinAnnotationColorPurple];
}
[pin setAnimatesDrop:YES];
return [pin autorelease];
}
else
return nil;
}
这个想法是我希望不同的注释视图(引脚)具有不同的颜色,具体取决于用户是否访问过它们以指示接下来要访问哪个注释。
这段代码工作正常,但我有几个问题希望有人能回答。
首先,MKPinAnnotations 从地图视图中取出并尽可能重用。在这样做的过程中(我在多个博客和论坛中找到了)
pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"unvisited"];
我知道返回值dequeueReusableAnnotationViewWithIdentifier:
是 MKAnnotationView 的实例,而是pin
指向 MKPinAnnotationView 实例的指针(它是 MKAnnotationView 的子类)。我想,这就是为什么(MKPinAnnotationView *)
在方法调用前面有一个“强制转换”的原因。这真的是一个演员吗?在这种情况下,它是否不危险,因为 MKPinAnnotationView 包含更多的实例变量(比 MKAnnotationView),因此内存空间更大?
我试图找到一些关于此的信息,但我没有找到任何人特别解释这一点。
此外,指针注释要么属于 MKUserLocation 类,要么属于我自己的AnnotationsWithIndices
符合 MKAnnotation 协议的自定义类。现在,为了确定注释视图应该具有哪种颜色,我在AnnotationsWithIndices
类中添加了一个名为 index 的实例变量。现在,当我为我写的索引调用 getter 时
int i = [(AnnotationsWithIndices *)annotation index];
现在,我基本上对此有同样的疑问。这里是否进行了强制转换,或者只是为了让编译器知道可以将消息索引发送到注释?我猜编译器希望注解是一个 id,而它实际上是一个指向 AnnotationsWithIndices 实例的指针。当然,我知道是这种情况,因为注释将属于我的自定义类,并且我也明确地检查了这一点以确保。是否(AnnotationsWithIndices)
只向编译器发出信号表明这没问题?
我也试图在没有运气的情况下找到有关此的信息。
我非常感谢您对此的任何回答。