2

我是 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]; }
     }
4

1 回答 1

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]; }

您正在创建一个的本地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];
于 2012-07-02T15:21:02.767 回答