2012-04-24 57 views
0

我目前有一个地图视图,其中有几个对象在MKAnnotation协议之后。有两种不同类型的对象,商店和竞争对手。不同的对象有不同类型的数据附加到他们。MKAnnotationView - 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)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对象。有人请向我解释如何输入这些图像或如何施放我的方法声明,以便我可以删除这些错误?

谢谢。

回答

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正在转换的对象的类别。

+0

感谢您的回答,我能够实现您的for循环,并从那里纠正我所有的问题。我尝试了'id a',但我仍然对objective-c很陌生,并没有意识到我需要这两种数据类型。 – Kyle 2012-04-24 21:33:13