2012-07-02 81 views
2

我是XCode領域的新人,想知道是否有人能幫助我。removeOverlay:overlay不能正常工作

本質上,我玩弄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

在控制操作方法,第一個參數(不管你什麼名字它)始終是調用該方法的對象。

這裏,控件是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什麼也不做,因爲這個新實例從未添加到地圖中。


要刪除現有的疊加,你要麼必須保持伊娃引用它,當您添加它並傳遞伊娃刪除或找到它在地圖視圖的overlays陣列英寸

但是,如果你永遠不會只有一個疊加,你可以傳遞的第一個對象在地圖視圖的overlays陣列或只是調用removeOverlays(複數),並通過全陣列式:

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

//OR... 

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

感謝安娜,那爲我清理了很多。我對這一切還是陌生的,這個迴應不僅回答了我的問題,而且我也從中學到了很多。謝謝! –