0

我目前有一个地图视图,其中填充了几个遵循 MKAnnotation 协议的对象。有两种不同类型的对象,商店和竞争对手。不同的对象附有不同类型的数据。

加载 mapView 后,程序会自动将我们商店和竞争对手的所有图钉放到地图上。每个图钉都使用一个自定义图像。当您缩小到更大的区域时,显然屏幕会变得非常混乱。我已经查看了基于此博客中描述的接近度过滤对象:http ://www.fiveminutes.eu/having-fun-with-ios-map-kit-grouping-annotations/

但在与一些同事讨论后,我们决定尝试在地图区域更改为纬度或经度增量大于 1.0

我已经创建了方法并实现了在用户放大和缩小时实现在较小和较大引脚之间切换的过程,但我似乎无法摆脱这个警告:

Sending "MKAnnotationView *" to parameter of incompatible type 'id<MKAnnotation>'

我知道这意味着我们可能做错了什么,将来可能会导致问题,所以我想在几天内发布 v1.1 之前修复它。

以下方法是我如何测试我的区域是否已超出我想要更改引脚的点。usingLargeIcons 是一个布尔值,它只是阻止我们在图标已经达到所需大小时调用 change 方法。

-(void)mapView:(MKMapView *)mapViewChanged regionDidChangeAnimated:(BOOL)animated
{
    NSLog(@"latitudeDelta = %f",mapViewChanged.region.span.latitudeDelta);
    NSLog(@"longitudeDelta = %f",mapViewChanged.region.span.longitudeDelta);
    //Sanity check on region
    if(mapView.region.span.latitudeDelta < 1.0){
        if(!usingLargeIcons){
            [self transformPinsLarge];
        }
    }else{
        if(usingLargeIcons){
            [self transformPinsSmall];
        }
    }
}

如您所见,此方法只是调用了两个转换方法。这些方法几乎相同,但有两个简单的单词变化 Small 和 Large。我的目标是获取地图上的所有引脚并将它们转储到一个阵列中,循环通过阵列并切换到较小的引脚。我不明白为什么我们会收到关于我们的对象不匹配的警告。如果我在 SO 的其他问题上错过了这一点,我深表歉意,请指出正确的方向,我将继续前进。我在 Google 上搜索了几个样式问题,但没有找到任何可以描述此对象警告的内容。

变换方法:

- (void)transformPinsSmall
{
    usingLargeIcons = NO;
    NSArray *allPins = [mapView annotations];
    for (MKAnnotationView *a in allPins) {
        //Gets small UIImage for brand, changes pin image
        [[mapView viewForAnnotation:a] setImage:[self imageForSmallAnnotation:a]];
    }
}

警告在 for 循环中的代码行上。“imageForSmallAnnotation”方法只是返回一个 UIImage 对象。有人可以向我解释如何输入这些图像或如何转换我的方法声明,以便我可以删除这些错误吗?

谢谢。

4

1 回答 1

0

错误消息实际上是

Sending "MKAnnotationView *" to parameter of incompatible type 'id<MKAnnotation>'

...相对于id<MKAnnotationView>?

如果是这样,那么问题是[mapView annotations]返回一个注释数组(即采用MKAnnotation协议的对象),并且您的 for 循环将这些对象强制转换为MKAnnotationView,然后会遇到问题。你可以试试:

for (id <MKAnnotation> a in allPins) {

...这将解决[mapView viewForAnnotation:a]期望a成为采用MKAnnotation协议的对象但被发送到的对象却被强制转换的问题MKAnnotationView

您可能还需要确保您的代码[self imageForSmallAnnotation:]正在接收它期望接收的对象类,如果以及何时更改要转换的对象a

于 2012-04-24T21:23:47.803 回答