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