removeOverlay:覆盖不起作用

时间:2012-07-02 14:45:05

标签: ios mkmapview mkoverlay

我是XCode领域的新人,并且想知道是否有人可以帮助我。

基本上,我正在玩WWDC2010的TileMap项目示例,并试图想出一种方法来使用分段控制器来隐藏他们的NOAA图表。

我可以激活叠加层,它显示正常,但我不能为我的生活使用分段控制器删除它。

以下是头文件中的一些代码:

@interface ViewController : UIViewController <MKMapViewDelegate> {
    IBOutlet MKMapView *map;
    IBOutlet UISegmentedControl *controller;
}    
- (IBAction)switchMap:(id)sender;
@end

这是.m的代码:

- (void)viewDidLoad {
    [super viewDidLoad];  
    NSLog(@"initial view loaded"); 
}  

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay {  

    TileOverlayView *view = [[TileOverlayView alloc] initWithOverlay:overlay];     
    view.tileAlpha = 1;
    return view;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:     (UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (IBAction)switchMap:(id)overlay {

    if (controller.selectedSegmentIndex == 0) {
        NSLog(@"welp... it loaded...");
        [map removeOverlay:overlay];
    }

    if (controller.selectedSegmentIndex == 1) {

        NSLog(@"Map Overlay works");
        NSString *tileDirectory = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Tiles"];
        TileOverlay *overlay = [[TileOverlay alloc] initWithTileDirectory:tileDirectory];
        [map addOverlay:overlay];

        MKMapRect visibleRect = [map mapRectThatFits:overlay.boundingMapRect];
        visibleRect.size.width /= 2;
        visibleRect.size.height /= 2;
        visibleRect.origin.x += visibleRect.size.width / 2;
        visibleRect.origin.y += visibleRect.size.height / 2;
        map.visibleMapRect = visibleRect;

    }


    if (controller.selectedSegmentIndex == 2) {
        NSLog(@"But... overlay isnt hiding waa");
        NSString *tileDirectory = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Tiles"];
        TileOverlay *overlay = [[TileOverlay alloc] initWithTileDirectory:tileDirectory];
        [map removeOverlay:overlay]; }
     }

1 个答案:

答案 0 :(得分:1)

在控制操作方法中,第一个参数(无论您命名它)始终是调用该方法的对象。

此处,控件是UISegmentedControl,因此传递给switchMap:的参数是对该控件的引用。在.h中,您已声明参数名为sender但在.m中的名称为overlay

无论名称如何,它仍然是分段控制对象,因此将其传递给removeOverlay是没有意义的,什么都不做。


所以在这段代码中:

if (controller.selectedSegmentIndex == 0) {
    NSLog(@"welp... it loaded...");
    [map removeOverlay:overlay];
}

overlay指向分段控件,因此removeOverlay不执行任何操作。


在这段代码中:

if (controller.selectedSegmentIndex == 2) {
    NSLog(@"But... overlay isnt hiding waa");
    NSString *tileDirectory = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Tiles"];
    TileOverlay *overlay = [[TileOverlay alloc] initWithTileDirectory:tileDirectory];
    [map removeOverlay:overlay]; }

您正在创建 new 本地overlay对象(编译器也可能会向您发出有关隐藏参数的本地变量的警告)。此新对象与已添加到地图的叠加层分开。在这个新对象上调用removeOverlay什么都不做,因为这个新实例从未首先添加到地图中。


要删除现有的叠加层,您必须在添加它时保留对它的ivar引用,并传递该ivar以在地图视图的overlays数组中删除或找到它。

但是,如果您只有一个叠加层,则可以在地图视图的overlays数组中传递第一个对象,或者只调用removeOverlays(复数)并传递整个数组:

if (map.overlays.count > 0)
    [map removeOverlay:[map.overlays objectAtIndex:0]];

//OR...

if (map.overlays.count > 0)
    [map removeOverlays:map.overlays];