我创建了以下方法来确定地图视图中注释的视图。
- (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的子类)。我想,这就是为什么在方法调用前面有一个'cast'似乎正在使用前缀(MKPinAnnotationView *)
。这真的是一个演员,在这种情况下,它是不是很危险,因为MKPinAnnotationView包含更多的实例变量(比MKAnnotationView),因此在内存中有更多的空间?
我试图找到一些关于此的信息,但我没有找到任何人特别解释这一点。
此外,指针注释是类MKUserLocation或我自己的符合MKAnnotation协议的自定义类AnnotationsWithIndices
。现在,为了确定注释视图应该具有哪种颜色,我在AnnotationsWithIndices
类中添加了一个名为index的实例变量。现在,当我为索引调用getter时,我写了
int i = [(AnnotationsWithIndices *)annotation index];
现在,我基本上对此有同样的疑问。是否有一个演员在这里或只是让编译器知道可以将消息索引发送到注释?我想编译器期望注释是一个id,而它实际上是一个指向AnnotationsWithIndices实例的指针。
当然我知道这是这种情况,因为注释将是我的自定义类,我也明确地检查这一点。 (AnnotationsWithIndices)
只是向编译器发出信号表明这是正常的吗?
我也试图在没有运气的情况下找到有关这方面的信息。
我非常感谢你的任何答案。