2

我正在尝试在平铺图像(下面的代码)顶部显示带有 kml 叠加层的平铺图像,并且收到以下错误:

'NSInvalidArgumentException',原因:'-[MKPolyline tilesInMapRect:zoomScale:]:无法识别的选择器发送到实例

是否有人对我是否正确接近多个叠加层或为什么会出现此错误有任何建议?

提前致谢!

(void)viewDidLoad
{
    [super viewDidLoad];
    // Initialize the map overlay with tiles in the app's bundle.
    NSString *tileDirectory = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Tiles"];

    MapOverlay *overlay1 = [[MapOverlay alloc] initWithDirectory:tileDirectory];

    // Locate the path to the route.kml file in the application's bundle
    // and parse it with the KMLParser.

    NSString *path = [[NSBundle mainBundle] pathForResource:@"route" ofType:@"kml"];
    NSURL *url = [NSURL fileURLWithPath:path];
    kmlParser = [[KMLParser alloc] initWithURL:url];
    [kmlParser parseKML];

    // Add all of the MKOverlay objects parsed from the KML file to the map.
    NSArray *overlay2 = [kmlParser overlays];

    [map addOverlay:overlay1];
    [map addOverlays:overlay2];

    // Set the starting location.
    CLLocationCoordinate2D startingLocation;
    startingLocation.latitude = 0.00;
    startingLocation.longitude =-0.00;

    map.region = MKCoordinateRegionMakeWithDistance(startingLocation, 4600, 4600);
    [map setCenterCoordinate:startingLocation];       
}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay1
{
    MapOverlayView *view = [[MapOverlayView alloc] initWithOverlay:overlay1];
    view.overlayAlpha = 1.0;
    return view;
}


- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay2:(id <MKOverlay>)overlay2
{
    return [kmlParser viewForOverlay:overlay2];
}

@end
4

1 回答 1

0

至少viewForOverlay委托方法没有正确实现。

您已经编写了两种方法:mapView:viewForOverlay:mapView:viewForOverlay2:.

但是地图视图只会始终调用mapView:viewForOverlay:,因为这是MKMapViewDelegate协议定义的方法名称。

mapView:viewForOverlay2:方法将被忽略并且不会被地图视图调用。

所以发生的情况是,当overlay2叠加数组添加到地图时,它会调用为叠加mapView:viewForOverlay:创建 a 的方法MapOverlayView(而不是从 获取叠加视图kmlParser)。这可能会导致问题(可能MapOverlayView只处理MapOverlay-type 覆盖)。


所有覆盖都应在该mapView:viewForOverlay:方法中处理。
要处理多种类型的覆盖,请检查overlay类并相应地处理:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MapOverlay class]])
    {
        MapOverlayView *view = [[MapOverlayView alloc] initWithOverlay:overlay];
        view.overlayAlpha = 1.0;
        return view;
    }

    //if not a MapOverlay, get from kmlParser...
    return [kmlParser viewForOverlay:overlay];
}

删除mapView:viewForOverlay2:方法。

于 2012-07-31T21:23:03.283 回答