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:との 2 つのメソッドを作成しましたmapView:viewForOverlay2:

ただし、マップ ビューは、プロトコルmapView:viewForOverlay:によって定義されたメソッド名であるため、常に呼び出すだけです。MKMapViewDelegate

このmapView:viewForOverlay2:メソッドは無視され、マップ ビューによって呼び出されません。

そのため、overlay2オーバーレイ配列がマップに追加されると、( からオーバーレイ ビューを取得する代わりに) オーバーレイmapView:viewForOverlay:の を作成するメソッドが呼び出されます。これにより、問題が発生する可能性があります (タイプのオーバーレイのみを処理する可能性があります)。MapOverlayViewkmlParserMapOverlayViewMapOverlay


すべてのオーバーレイは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 に答える